使用__slots__
正常情况下,在定义了一个类并且创建其实例后,可以向这个实例绑定任何属性和方法,这是动态语言的灵活性。例如:
class Student:
pass
s = Student()
s.name = 'Kate'
print(s.name)
以上示例只是绑定了一个属性,实际上还可以为其绑定方法。但是对一个实例绑定的方法,对另一个实例是不起作用的。如果需要给所有实例都绑定方法,可以直接将方法绑定给类。例如:
# 以下绑定了一个方法到实例
def set_age(self, age):
self.age = age
from types import MethodType
s.set_age = MethodType(set_age, s)
s.set_age(25)
print(s.age)
# 以下绑定了一个方法到类
def set_score(self, score):
self.score = score
Student.set_score = set_score
s.set_score(100)
print(s.score)
但是在很多时候需要限制实例的属性,不能允许随意添加属性,这时就需要__slots__
来完成限制工作。Python允许在定义类的时候使用一个特殊的__slots__
变量来限制类能够添加的属性。例如:
class Student:
__slots__ = ('name', 'age')
s = Student()
s.name = 'Kate'
s.age = 20
s.score = 100 # 这一句将会报错
如果子类中也定义了__slots__
,那么子类中允许定义的属性就是其自身定义的__slots__
加上父类的__slots__
。