class SubPerson(Person):
@property # Doesn't work
def name(self):
print('Getting name')
return super().name
你应该像之前说过的那样修改代码:
class SubPerson(Person):
@Person.getter
def name(self):
print('Getting name')
return super().name
这么写后,property之前已经定义过的方法会被复制过来,而getter函数被替换。
在这个特别的解决方案中,我们没办法使用更加通用的方式去替换硬编码的 Person 类名。 如果你不知道到底是哪个基类定义了property, 那你只能通过重新定义所有property并使用 super() 来将控制权传递给前面的实现。
值的注意的是上面演示的第一种技术还可以被用来扩展一个描述器:
# A descriptor
class String:
def __init__(self, name):
self.name = name
def __get__(self, instance, cls):
if instance is None:
return self
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, str):
raise TypeError('Expected a string')
instance.__dict__[self.name] = value
# A class with a descriptor
class Person:
name = String('name')
def __init__(self, name):
self.name = name
# Extending a descriptor with a property
class SubPerson(Person):
@property
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)