美文网首页
python 子类中扩张超类属性

python 子类中扩张超类属性

作者: SkTj | 来源:发表于2019-12-03 13:46 被阅读0次

    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)

    相关文章

      网友评论

          本文标题:python 子类中扩张超类属性

          本文链接:https://www.haomeiwen.com/subject/emdcpctx.html