使用__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__