好乱。。。
Topic source我感觉是你还没弄懂_slots_的作用,廖老师文档里写得很清楚:_slots_的作用是限制实例的属性添加的,但你的set_city方法中的city是类变量并不是实例变量(尽管实例可以访问到city),所以你说slots并不能完全限制属性添加是错误的!
有一点特别不明白:用MethodType绑定到类和把方法直接写到类里为什么实例的属性值会不同?比如:
from types import MethodType
def set_age(self,age):
self.age=age
class Stu(object):
pass
Stu.set_age=MethodType(set_age,Stu)
a=Stu()
s=Stu()
a.set_age(10)
s.set_age(15)
print(a.age,s.age)\\15 15
显然无论是a.set_age(10)还是s.set_age(15)都把类的属性值给改了,感觉大家指向的是同一个地方。
但如果是在一开始就在类里声明了set_age这个方法,而不是动态的绑定,结果就不一样了。
class Student(object):
def set_age1(self,age):
self.age=age
a=Student()
s=Student()
a.set_age1(10)
s.set_age1(15)
print(a.age,s.age)\\10 15
感觉这里面a和s两个实例里面都有age属性,set_age1改变的是实例属性值。
所以,我就不明白了,MethodType动态绑定这种东西到底绑了什么?为什么把类绑定方法之后,其实例可以用这个方法,但是没有里面的属性呢?还有类里面有1,2,3个属性,其实例不应该一上来就有1,2,3这3个属性么?怎么还能类里有的属性,实例没有呢?
晕了,习惯了静态的各种声明,动态的直接蒙圈了。。。。
def set_name(self,name): self.name2 = name
A.set_name = MethodType(set_name,A)
// 我觉得动态绑定方法是给原类开辟一个新的内层空间,但如果 // 空间跟原类同名了就会被隐藏。我把你的self.name改成name2就好了 // 不知道这样理解对不对。请指教!
1、slots只是在限制类的属性,而没有限制类添加方法。
__slots__ = ('name', 'age', 'set_city')
所以你在slots__限制的set_city方法根本没用,去掉也一样能使用Method添加方法 Student.set_city = MethodType(set_city, Student)
你这里的
a1 = A('a1')
是在初始化的时候赋予对象a1一个实例属性name 而当你用
A.set_name = MethodType(set_name,A)
的时候你又为类A赋予了一个类属性name 这样就导致你的代码中
a1.set_name('A1')
实际上是为类attribute (name)赋予了具体的值'A1' 而由于实例a1的实例属性name和类属性name同名并且a1已经为自己的实例属性name赋值了,所以也就覆盖掉了类属性name的值'A1'.
PS:你可以在你的代码最后输
print(A.name)
看看是不是得到的结果为'A1'
a.set_age(15) \通过set_age方法,设置的类属性age的值 s.set_age(11) \也是设置类属性age的值,并把上个值覆盖掉 print(s.age,a.age) \由于a和s自身没有age属性,所以打印的是类属性age的值
一样的输入,为何我这里没有出现覆盖,还是11,15
吴利民5705255624
def init(self,name)定义错误 应该是def init(self,name)