Discuss / Python / 我试了n次,还是可以.怎么回事?

我试了n次,还是可以.怎么回事?

Topic source

神月宗

#1 Created at ... [Delete] [Delete and Lock User]

使用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,调用也没错啊!

愁啊~~~

丶姆路

#2 Created at ... [Delete] [Delete and Lock User]

NewStudent不继承Student吗?写基类Object干什么

神月宗

#3 Created at ... [Delete] [Delete and Lock User]

我的意思是,不是说slots对继承的子类无作用么?为什么我还是能用name 和 age 呢?我的哥啊,你关注的地方在哪?

我是爆霖

#4 Created at ... [Delete] [Delete and Lock User]

我觉得Student 和 NewStudent没关系, 然后d的name和age属性是你直接绑定到实例对象上的,NewStudent没有slots的限制,自然属性都能绑定

solts的意思是你只能绑定name和age……

你的NewStudent类是个新的类,并不是继承Student的子类,所以你加什么东西都可以加啊。

Thepackbacker

#7 Created at ... [Delete] [Delete and Lock User]

楼上解释清楚了,你NewStudent括号里面的object换成Student,才叫继承Student的子类

你还没理解继承的概念吧。。。

神月宗

#9 Created at ... [Delete] [Delete and Lock User]

我菜,我不说话

脏醒铅

#10 Created at ... [Delete] [Delete and Lock User]

其实 __slots__ 绑定的是 允许 添加的属性,对子类没有效果,也就是说子类并没有规定哪些允许添加,哪些不允许添加,所以,子类实例可以添加任何属性,没毛病啊


  • 1
  • 2

Reply