python 子类中扩张超类属性

2019-12-03  本文已影响0人  SkTj

setting delete

考虑如下的代码,它定义了一个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)

上一篇 下一篇

猜你喜欢

热点阅读