本篇文章为大家展示了__slots__如何在Python项目中正确使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
正常情况下,创建类的实例后,可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。首先定义一个类
类(对象): 通过
然后创建一个实例,并给实例添加属性和方法。
打印。__dict__ #…… f=λ:100 一个。有趣=f 打印一个。__dict__ #……+ & # 39;快乐# 39;:& lt;功能& lt; lambda>在0 x0000000003582978>
此时,类一个的所有实例就能使用方法有趣()了。
, # 8203;通常情况下,上面的乐趣()方法应该定义在类中,但动态绑定允许在程序运行的过程中动态的给类增加功能,这在静态语言中很难实现,这也是动态语言的优点。
, # 8203;如果在一个类中定义了__slots__属性,那么这个类的实例将不会拥有__dict__属性,没有__dict__的实例也就不能添加实例属性了。简单来说,__slots__的作用就是阻止类在实例化时为实例分配__dict__属性,限制该实例能添加的属性。
<强>作用强>
, # 8203;通常情况下实例使用__dict__来存储自己的属性,它允许实例动态地添加或删除属性。然而,对一些在编译期就已经知道有什么变量的类或者不允许动态添加变量的类来说,它们并不需要动态地添加变量。如果想要限制实例属性,不想让它动态添加属性怎么办?比如我们只允许对一个的实例添加姓名和年龄属性。
, # 8203;为了达到上述目的,Python允许在定义类的时候,定义一个__slots__变量,来限制该阶级的实例能添加的属性。
类(对象): __slots__=(& # 39;年龄# 39;& # 39;名字# 39;)=() a.name=& # 39;小明# 39; 一个。=10岁 一个。id=123456 #错误AttributeError: & # 39;一个# 39;对象没有属性& # 39;id # 39;
由于id不在__slots__中,所以实例不能添加id属性。任何试图给实例添加一个其名不在__slots__中的属性都将触发AttributeError异常。
__slots__中的变量是类属性,类型为数据描述符。
# !/usr/bin/python # - * -编码:utf - 8 - * 类Foo(对象): __slots__=(& # 39;年龄# 39;& # 39;名字# 39;) def __init__(自我、年龄=0): 自我。年龄=年龄 s=Foo.__dict__[& # 39;年龄# 39;】 打印年代# & lt;成员& # 39;年龄# 39;& # 39;foo # 39;objects> 印刷型(s) # & lt; & # 39; member_descriptor& # 39;比; & # 39;& # 39;& # 39;证明为数据描述符& # 39;& # 39;& # 39; 打印& # 39;__get__& # 39;在dir (s) #真的 打印& # 39;__set__& # 39;在dir (s) #真正的
__slots__中的变量虽然是类属性,但是不同实例之间互不影响。因为描述符方法的一个参数为实例,建立一个实例和值的映射还是很简单的。如果不懂,建议看描述符。
__slots__如何在Python项目中正确使用