开发者社区> 问答> 正文

子类中扩展property

在子类中,你想要扩展定义在父类中的property的功能。

展开
收起
哦哦喔 2020-04-17 15:02:51 823 0
1 条回答
写回答
取消 提交回答
  • 考虑如下的代码,它定义了一个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
    
    2020-04-17 15:03:10
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载