猿问

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

昨天一位朋友向我展示了以下在 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()有意义是特定于函数的,并且对于非函数会以某种方式失败。


事实并非如此。上面的代码printsas ifbar已经self.bar = 4在__init__方法中设置了。


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


✱ getter 和 setter 仅用于证明其 Foo.bar真正打算作为默认值foo_instance.bar,不应被解释为支持在惯用 Python 中使用 getter 和 setter。


蛊毒传说
浏览 120回答 1
1回答
随时随地看视频慕课网APP

相关分类

Python
我要回答