8.8 我们想在子类中扩展某个属性,而这个属性是在父类中定义的
class Person:
def __init__(self,name):
self.name = name
@property
def name(self):
return self.name
@name.setter
def name(self,value):
if not isinstance(value,str):
raise TypeError('Expected a String')
self._name= value
@name.deleter
def name(self):
raise AttributeError("cant delete attribute")
class SubPerson(Person):
@porperty
def name(self):
print("getting name")
return super().name
@name.setter
def name(self,value):
print("setting name to",value)
super(SubPerson,SubPerson).name.__set__(self,value)
@name.deleter
def name(self):
print("deleting name")
super(SubPerson,SubPerson).name.__delete__(self)
s = SubPerson("Guido")
print(s)
print(s.name)
s.name = "Larry"
print(s)
print(s.name)
- 我们从Person类中继承,然后在子类中扩展name属性的功能
注意
- 在子类中扩展属性会引入一些非常微妙的问题,因为属性其实是被定义为getter,setter和deleter方法的合集,而不仅仅是单独的方法
- 因此,当我们扩展一个属性时,需要弄清楚是要重新定义所有方法,还是只针对某一个方法进行扩展
网友评论