将Python类变量设为类函数的输出
可以把一个变量设置为一个函数返回的值吗?在下面的例子中,我希望 foo.baz
的值等同于调用 foo._baz()
。我想知道有没有办法让 baz
自动更新,而不需要每次 bar
更新的时候都写代码去更新 baz
,同时还能把 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
3 个回答
0
你遇到的问题是因为baz这个类属性只在对象初始化的时候用max()函数写入一次——这个时候把'3'存储为值,然后就再也没有改变过。
你可以通过把baz属性当作一个属性来解决这个问题——这样就可以返回bar的最大值,而不是直接写入属性。这样做的话,当bar属性被修改时,baz的值也会随之改变。
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
方法,并返回这个方法的结果。
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
>>>