这这一节主要是动态为对象/实例
添加属性和方法
代码如下
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实例添加name
和score
属性
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__
定义的属性仅对当前类实例起作用,对继承的子类是不起作用的: