网络知识 娱乐 python 中的 __slot__ 的用法

python 中的 __slot__ 的用法

python 中的 __slot__ 的用法

在看sanic 源码时,发现在定义类的时候,会设置一个__slot__属性,由于之前没有用过个魔术变量,所以查了一下,这里记录一下该属性的作用。

我们知道,在python 的实例中,我们可以动态地给实例绑定属性与方法,像下面这样

class Test:n def __init__(self, name, age):n self.name = namen self.age = agennt = Test("yangyanxing", 18)nprint(t.name, t.age)n# 给t 绑定一个city 属性nt.city = "BeiJing"nprint(t.city)n

我们在类中并没有定义city 属性,但是我们却可以给Test 实例添加一个city 属性,这个在python 中是被允许的。当然我也可以绑定方法

from types import MethodTypennnclass Test:n def __init__(self, name, age):n self.name = namen self.age = agennndef show(self, msg):n print(f"hello {self.name}, {msg}")nnnt = Test("yangyanxing", 18)n# 给t 绑定show 方法,这里需要使用MethodTypent.show = MethodType(show, t)nt.show("欢迎")n

但是这种绑定是针对实例的,像上面的t 实例,如果再实例化另一个实例,它依然是没有city属性和show方法的。

但是有时候,我们并不希望给实例乱加属性与方法,或者我们想限制一下实例的属性与方法,只能设置我们规定的属性与方法,这时就可以通过 __slot__ 来限制

from types import MethodTypennnclass Test:n def __init__(self, name, age):n self.name = namen self.age = agenn __slots__ = (n "name",n "age",n "city",n "show",n )nnndef show(self, msg):n print(f"hello {self.name}, {msg}")nnnt = Test("yangyanxing", 18)nprint(t.name, t.age)n# 给t 绑定一个city 属性nt.city = "BeiJing"n# 给t 绑定show 方法nt.show = MethodType(show, t)nprint(t.city)nt.show("欢迎")nt.school = "bjut"n

这里的school 不在 __slot__ 里,所以这里会崩溃,不让设置。如果想要限制实例的属性,可以通过设置类的__slot__。

但是子类不受限制,除非子类也设置了__slot__属性,子类如果也设置了__slot__属性,那么子类的属性限制是父类的slot加上自己的slot 之和