是否可以设置一个等于函数返回值的变量?在下面的示例中,我希望foo.baz
等同于调用foo._baz()
。想知道是否有可能baz
更新而不会在每次更新baz
时编写更新bar
的代码,同时仍然将baz
称为对象。
class Foo(object):
def __init__(self):
self.bar = [1,2,3]
self.baz = self._baz()
def _baz(self):
return max(self.bar)
foo = Foo()
foo.bar
Out[90]: [1, 2, 3]
foo.baz
Out[91]: 3
foo.bar.append(7)
foo.baz
Out[93]: 3
答案 0 :(得分:2)
使用property
:
>>> class Foo(object):
... def __init__(self):
... self.bar = [1,2,3]
... #self.baz = self._baz()
... def _baz(self):
... return max(self.bar)
... baz = property(_baz)
...
>>>
>>> foo = Foo()
>>> foo.bar
[1, 2, 3]
>>> foo.baz
3
>>> foo.bar.append(7)
>>> foo.baz
7
在上面的代码中,调用_baz
方法,并在访问baz
属性时返回方法的返回值。
答案 1 :(得分:2)
您应该baz
property
:
class Foo(object):
def __init__(self):
self.bar = [1,2,3]
@property
def baz(self):
return max(self.bar)
参见下面的演示:
>>> foo = Foo()
>>> foo.bar
[1, 2, 3]
>>> foo.baz # foo.baz is called and returns max(foo.bar)
3
>>> foo.bar.append(7) # foo.baz is not called
>>> foo.baz # foo.baz is called and returns max(foo.bar)
7
>>>
答案 2 :(得分:0)
你所拥有的东西不起作用的原因是因为只有在初始化对象时才使用max()函数写入baz类属性 - '3'作为值存储,并且从不重写。
您可以通过将baz属性视为属性来进一步修复 - 并返回bar的max() - 不写入属性,当然,在写入bar属性时会更改。