Python高级编程使用__slots__

这这一节主要是动态为对象/实例添加属性和方法

代码如下

from types import MethodType

#这是外部方法1
def set_name(self, name):
    self.name = name


#这是外部方法2
def set_score(self, score):
    self.score = score    

class Student(object):
    __slots__ = ('name')

    def set_age(self, age):
        self.age = age

stu = Student();
stu.age = 10
stu.set_age(20)

#给实例绑定一个方法,此处绑定到实例stu,对其他实例不起作用
stu.set_name = MethodType(set_name, stu) # 给实例绑定一个方法
stu.set_name('Rick')

print(stu.name)    

#给类绑定一个方法,所有的实例都可以使用
Student.set_score = MethodType(set_score, Student)
stu.set_score(99.5)
print(stu.score)

使用slots

但是,如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加namescore属性

class Student(object):
    __slots__ = ('name', 'store') # 用tuple定义允许绑定的属性名称

如果有不允许的属性,将会抛出异常

F:\python>python slots.py
Traceback (most recent call last):
  File "slots.py", line 18, in <module>
    stu.age = 10
AttributeError: 'Student' object has no attribute 'age'

Note:
使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的: