代码之家  ›  专栏  ›  技术社区  ›  Greg Nisbet

将类属性定义为实例变量的默认值是否习惯?

  •  0
  • Greg Nisbet  · 技术社区  · 6 年前

    昨天,一位朋友向我展示了下面的技术,为实例变量提供python中的默认值。

    班级 Foo 有它自己的 bar 属性,在查找不存在的实例的属性时默认检索该属性。例如,以下代码片段将打印 4 A.±

    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_instance.get_bar() 有意义是特定于函数的,对于非函数则会以某种方式失败。

    事实并非如此。以上代码 prints 仿佛 酒吧 是通过 self.bar = 4 __init__ 方法。

    这个结构是惯用的吗?我能想到的唯一反对它的理由是,它打破了结构上的平等,可能隐藏了调试时“逻辑上存在”的对象的属性,如果默认值是有状态的,则可能会无意中改变全局状态。


    “getter和setter只用于演示 Foo.bar 实际上是要作为 foo_instance.bar 而且不应该被解释为支持在惯用python中使用getter和setter。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Rich Tier    6 年前

    我们可以让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