自己的总结
Topic source上面打错了。。。补充一下
更正:
AttributeError: 'Student' object attribute 'name' is read-only
挺奇怪的。。。。
而且用MethodType给类绑定方法后,实例调用相关方法后设置的是类的属性而不是实例属性。
有点迷。。。。。
补充:
子类定义中没有slots参数的情况不继承父类__slots__参数,
有slots参数的情况继承父类__slots__参数+自己的__slots__参数
- 1
Tb要更加努力
一、给类和实例动态绑定属性和方法:
1.绑定属性:
class Student:
pass
s = Student()
Student.name = '学生'
s.name = '学生s'
2.绑定方法:
from types import MethodType
def set_age(self, age):
self.age = age
Student.set_age = MethodType(set_age, Student)
s.set_age = MethodType(set_age, s)
二、__slots__使用:
限制类的实例的属性添加
Class Student:
__slots__ = ('name', 'age')
s2 = Student()
#s2为Student类的实例,类中没有name和age属性的前提下,可以添加name和age属性
#类中存在name和age属性,python返回错误,属性只可读
#添加实例属性
s2.name = 's2'
s2.age = 20
#添加类属性
Student.name = '学生'
Student.age = 10
#实例和类同时存在相同名字属性,按理说实例属性应该覆盖掉了类属性
s2.name
>>'学生‘
#实例属性被类属性覆盖,再次修改实例属性,python提示只可读
s2.name = 's2'
AttributeError: 'Student' object attribute 'name' is read-only
挺奇怪的。。。。应该是MethodType的内部逻辑吧??
而且用MethodType给类绑定方法后,实例调用相关方法后设置的是类的属性而不是实例属性。
有点迷。。。。。