使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
然而:...
class Student(object): slots = ("name","age")
class NewStudent(object): pass
s = Student() d = NewStudent()
s.name = "Jack" s.age = 19
#s.score = 99 ERROR!
d.name = "iven" d.age = 23
print s.name,s.age print d.name,d.age
输出: Jack,19 iven,23
不是说好的,"使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的"吗?怎么回事?(理解不了)
这句,我就能理解! 除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots。 就是在现有的属性中可以覆盖父类的属性,但是原本父类的属性也还是可以被子类调用啊!
比如,d.name,调用也没错啊!
愁啊~~~
NewStudent不继承Student吗?写基类Object干什么
我的意思是,不是说slots对继承的子类无作用么?为什么我还是能用name 和 age 呢?我的哥啊,你关注的地方在哪?
我觉得Student 和 NewStudent没关系, 然后d的name和age属性是你直接绑定到实例对象上的,NewStudent没有slots的限制,自然属性都能绑定
solts的意思是你只能绑定name和age……
你的NewStudent类是个新的类,并不是继承Student的子类,所以你加什么东西都可以加啊。
楼上解释清楚了,你NewStudent括号里面的object换成Student,才叫继承Student的子类
你还没理解继承的概念吧。。。
我菜,我不说话
其实 __slots__ 绑定的是 允许 添加的属性,对子类没有效果,也就是说子类并没有规定哪些允许添加,哪些不允许添加,所以,子类实例可以添加任何属性,没毛病啊
Sign in to make a reply
神月宗
使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
然而:...
class Student(object): slots = ("name","age")
class NewStudent(object): pass
s = Student() d = NewStudent()
s.name = "Jack" s.age = 19
#s.score = 99 ERROR!
d.name = "iven" d.age = 23
print s.name,s.age print d.name,d.age
输出: Jack,19 iven,23
不是说好的,"使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的"吗?怎么回事?(理解不了)
这句,我就能理解! 除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots。 就是在现有的属性中可以覆盖父类的属性,但是原本父类的属性也还是可以被子类调用啊!
比如,d.name,调用也没错啊!
愁啊~~~