好乱。。。
Topic sourceprint(s.age,a.age) \\由于a和s自身没有age属性,所以打印的是类属性age的值
感觉不是这样的……
print(dir(s)==dir(Stu))
获得的结果是s跟Stu的属性、方法相同,也就是都有age属性。问题在这样的:如果修改或者添加了抽象类的属性,所有实例对应的属性同时变动。
a.set_age(15) \\通过set_age方法,设置的类属性age的值
s.set_age(11) \\也是设置类属性age的值,并把上个值覆盖掉
以上调用set_age方法修改的实际是抽象类的age属性,所有的实例同时修改。
张教主总结的挺好的! @HwieChern 这位朋友说错了,print(dir(s)==dir(Stu)),结果是True,但是并不代表 实例变量s有age这个属性。事实上,在这个时候实例变量是还没有age这个实例属性的,都是类属性。可以用 del s.age试试,发现会报错。s没有age这个实例属性
新手不明白
绑定方法
class A(object): def init(self,name): self.name = name def get_name(self): print(self.name) def set_name(self,name): self.name = name
from types import MethodType
A.set_name = MethodType(set_name,A)
a1 = A('a1') print(a1.name) #result: a1 a1.set_name('A1') print(a1.name) #result: a1 这里不明白为啥还是打印出a1
張-教-主
第一,slots只能限制添加属性,不能限制通过添加方法来添加属性:
上段代码中,Student类限制两个属性name 和 age,但可以通过添加方法添加一个city属性(甚至可以添加很多属性,只要set_city方法里有包括)
第二,属性分实例属性和类属性,多个实例同时更改类属性,值是最后更改的一个
所以, 1,slots并不能严格限制属性的添加,可通过在方法里定义限制之外的属性来添加本不能添加的属性(当然,前提是方法没有被限制) 2,类属性是公共属性,所有实例都可以引用的,前提是实例自身没有同名的属性,因此类属性不能随意更改(别的实例可能在引用类属性的值),就是说不能随便用a.set_age()更改age的值(因为调用此方法更改的是类属性age的值,不是实例a自身的age属性值)
各位大神,小弟理解哪里不对,请指正^_^~