昨天,一位朋友向我展示了下面的技术,为实例变量提供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。