python 中的@property以及在继承中的使用

使用@property
知道@property是为了既能检查参数,又可以用类似属性这样简单的方式来访问类的变量。
但是发现python2.7中继承的子类中使用会有问题

  • 继承的子类实现@property
class Publisher:

    def __init__(self):
        pass


class DefaultFormatter(Publisher):

    def __init__(self, name):
        self.name = name
        self._data = 0

    def __str__(self):
        return "{}: '{}' has data = {}".format(type(self).__name__, self.name, self._data)

    @property
    def data(self):
        return self._data

    @data.setter
    def data(self, new_value):
        print("execute data.setter", new_value)
        try:
            self._data = int(new_value)
        except ValueError as e:
            print('Error: {}'.format(e))
def main():
    df = DefaultFormatter('test1')
    print(df)
    df.data = 666
    print(df.data)
    print(df)

if __name__ == '__main__':
    main()

输出结果为:

instance: 'test1' has data = 0
666
instance: 'test1' has data = 0

Process finished with exit code 0

调试后发现, df.data = 666语句并没有进入函数def data(self, new_value):。因此并没有更改self._data的值。反而为该对象添加了新的变量self.data,因此self.data:666,而self._data:0

  • 如果没有继承的话,
class Publisher:

    def __init__(self):
        pass


class DefaultFormatter(object):

    def __init__(self, name):
        self.name = name
        self._data = 0

    def __str__(self):
        return "{}: '{}' has data = {}".format(type(self).__name__, self.name, self._data)

    @property
    def data(self):
        return self._data

    @data.setter
    def data(self, new_value):
        print("execute data.setter", new_value)
        try:
            self._data = int(new_value)
        except ValueError as e:
            print('Error: {}'.format(e))

输出结果为:

DefaultFormatter: 'test1' has data = 0
('execute data.setter', 666)
666
DefaultFormatter: 'test1' has data = 666

调试后发现,代码正常进入了函数 def data(self, new_value):
因此在继承的子类中还是尽量不要用@property了。
至于原因,可以参考使用slots,继承的时候,没有识别出来,而是给该实例动态绑定了一个属性data
同样的,在python2.7中,当继承的时候,__slots__也不起作用

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 8,268评论 0 9
  • 高阶函数:将函数作为参数 sortted()它还可以接收一个key函数来实现自定义的排序,reversec参数可反...
    royal_47a2阅读 4,106评论 0 0
  • 一、封装【private】 1.概念 广义的封装:函数和类的定义本身,就是封装的体现狭义的封装:一个类的某些属性,...
    hollow_02f9阅读 5,258评论 0 3
  • 不知道什么时候起周围的人们谈论《太阳的后裔》胜过谈论天气,宋仲基突然成了所有女人的老公,单身女提起他一个个都像热...
    喜姐阅读 3,203评论 0 5
  • 晚上闲着无事让妹妹帮我把白头发薅一下,最近一年多,猛增白头发,而且全在刘海部分,每天梳头看起来相当不舒服,确实这一...
    小菜鸟程序媛阅读 4,302评论 5 6

友情链接更多精彩内容