昨天有个朋友向我展示了以下为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
答案 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