Discuss / Python / 继承中使用slots时出现的一些情况

继承中使用slots时出现的一些情况

Topic source

yoihikari

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

主要是看了久疤的讨论后,研究了下,貌似发现了一些,分点写写。 前提:父类绑定赋值方法,绑定方法用setattr或者MethodType,实例是子类的实例,父类属性已赋值,实例调用父类方法。 ……………………………… 根据子类是否使用slots分成两种情况:

  1. 子类无slots: (1)如果使用MethodType绑定赋值方法,可以进行赋值,赋值结果实例、父类、子类值一致 (2)如果用setattr绑定,可以给实例赋值,但不可以给父类和子类赋值,后两者一致
  2. 子类有slots (1)只有其他属性,无赋值所对应的属性
  3. 用setattr绑定,赋值方法不能用,显示只读,实例,父类和子类都为原值
  4. 用MethodType,赋值方法可以用,实例,父类和子类值都更改 (2)有赋值所对应的属性
  5. 用setattr绑定,不能给父类和子类赋值,两者不一致,但可以给实例赋值
  6. 用MethodType绑定,不能给实例通过父类方法赋值,只能直接赋值,只能给父类赋值,不能给子类赋值。

…………………… 大致六种情况,下面是一些调试代码:

from types import MethodType class Stu2(object): slots = ('time','name','age','setName','getName','setAge','getAge')

def setAge(self,age): self.age = age def getAge(self): return self.age def setName(self,name): self.name = name def getName(self): return self.name

Stu2.setAge = MethodType(setAge,Stu2)

setattr(Stu2,'setAge',setAge) setattr(Stu2,'getAge',getAge) setattr(Stu2,'getName',getName)

setattr(Stu2,'setName',setName)

setattr(Stu2,'age',-1) Stu2.setName = MethodType(setName,Stu2) setattr(Stu2,'name','HZF') print(Stu2().getAge()) a=Stu2()

print(a.getName()) print(Stu2.name)

class Stu4(Stu2): slots = ('name','age') pass s5 = Stu4()

s5.name='Juny'

s5.setName('Juny')

print(s5.name)

print(Stu2.name==Stu4.name) print(Stu4.name) print(Stu2.name)

s5.setAge(25) print(Stu4.age==Stu2.age) print(Stu2.age) print(Stu4.age) print(s5.age)

yoihikari

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

醉了,这排版…… 子类有slots分两点,3,4是(1)里的,5,6是(2)里的

不要说排版的事情,是你不会用把……上面不都有插入代码那个选项么,或者用一组```的形式先点插入代码,在中间写入代码,而不是自己写代码,拜托学学markdown语法再来评论


  • 1

Reply