__slots__ 的 个人小发现
Topic source小白。如果说错请纠正赐教。
看了你的,我又试了试MethodType(set_age, Student),同样也是添加不进去,报错是type object has no attribute。总结起来,就是不管是类还是实例的__slot__,都不能用MethodType,但是都可以用A.B(A是对象,B是attribute)来赋值。所以我在想是不是__slot__本身就是专门限制绑定方法的。
我试了
stu.set_age = MethodType(set_age, Student)
stu.set_age(20)
print(stu.age)keyi
可以执行呀???难道添加的不对?
不是很懂
from types import MethodType
class Student(object):
__slots__ = ('set_gender')
def set_gender(self, gender):
self.gender = gender
stu = Student()
# 给实例添加方法
stu.set_gender = MethodType(set_gender, stu)
# 调用实例的方法失败
stu.set_gender('male') # AttributeError
# 给类添加方法
Student.set_gender = set_gender
# 调用实例的方法失败
stu.set_gender('male') # AttributeError
# 给类添加方法
Student.set_gender = MethodType(set_gender, Student)
# 调用实例的方法成功
stu.set_gender('male') # 没有报错
最后给类添加方法的这两种方式有什么区别吗?求大神解答……
stu.set_age = MethodType(set_age,Student)
添加的是类属性的age,__slots__限制的是实例属性的添加,不限制类属性添加。
print(stu.age) 返回的是类属性的age,只读属性。
@JX锦侠
我上一个回答,回答了你最后一个为啥成功的原因;
你第二个失败的原因是, Student.set_gender = set_gender 这个行为并没有绑定函数给 Stedent 类,
因为给Stedent 绑定函数的方式,不是直接赋予函数名;而是要使用MethodType() 函数才对
@codeig
>>> def set_score(self, score):
... self.score = score
...
>>> Student.set_score = set_score
给类绑定方法不是只能用Method Type()函数吧?
- 1
- 2
用户5316519431
先看代码:
通过上面我们发现使用__slots__限制的仅仅是类的实例的属性或者方法的动态添加,类本身的属性的添加不受__slots__的限制。
说明二:
当执行这个py 文件后,报错:AttributeError: 'Student' object has no attribute 'age' 这个可以告诉我们在给类的实例添加方法时,不能添加__slots__限制之外的属性。此处即添加了age参数。不在__slots__ 限制属性内。