考虑如下的代码,它定义了一个property:
class Person: def init(self, name): self.name = name
# Getter function
@property
def name(self):
return self._name
# Setter function
@name.setter
def name(self, value):
if not isinstance(value, str):
raise TypeError('Expected a string')
self._name = value
# Deleter function
@name.deleter
def name(self):
raise AttributeError("Can't delete attribute")
下面是一个示例类,它继承自Person并扩展了 name 属性的功能:
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)
接下来使用这个新类:
s = SubPerson('Guido') Setting name to Guido s.name Getting name 'Guido' s.name = 'Larry' Setting name to Larry s.name = 42 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "example.py", line 16, in name raise TypeError('Expected a string') TypeError: Expected a string
如果你仅仅只想扩展property的某一个方法,那么可以像下面这样写:
class SubPerson(Person): @Person.name.getter def name(self): print('Getting name') return super().name 或者,你只想修改setter方法,就这么写:
class SubPerson(Person): @Person.name.setter def name(self, value): print('Setting name to', value) super(SubPerson, SubPerson).name.set(self, value)