将类属性定义为实例变量的默认值是否很常见

时间:2018-11-01 21:56:41

标签: python

昨天有个朋友向我展示了以下为Python中的实例变量赋予默认值的技术。

Foo有其自己的bar属性,当在不存在的实例上查找属性时,默认情况下会检索该属性。例如,以下代码片段将显示4✱。

class Foo:
    bar = 4

    def __init__(self):
        pass

    def get_bar(self):
        return self.bar

    def set_bar(self, bar):
        self.bar = bar


print(Foo().get_bar())

最初,我对此功能感到惊讶。我认为用于“退回到类的定义”的机制将foo_instance.get_bar转换/评估/定义为类Foo的绑定方法并使foo_instance.get_bar()有意义,这是函数和函数所特有的。由于某种原因将无法正常工作。

情况并非如此。上面的代码prints就像bar是通过self.bar = 4方法中的__init__设置的。

这种结构是惯用的吗?我能想到的唯一论据是,它破坏了结构相等性,可能在调试时隐藏“逻辑上存在”的对象的属性,并且如果默认值是有状态的,则可能会无意间改变全局状态。


✱getter和setter仅用于证明Foo.bar实际上是foo_instance.bar的默认值,不应解释为支持惯用Python中使用getter和setters

1 个答案:

答案 0 :(得分:0)

我们可以让python为我们完成艰苦的工作:

class Foo:
    _bar = 4

    @property
    def bar(self):
        print('getting _bar')
        return self._bar

    @bar.setter
    def bar(self, value):
         print('setting _bar')
         self._bar = value

foo = Foo()
print(foo.bar)  # 4
foo.bar = 6
print(foo.bar)  # 6