将Python类变量设置为等于类函数的输出

时间:2014-07-03 15:08:16

标签: python class python-2.7

是否可以设置一个等于函数返回值的变量?在下面的示例中,我希望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

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属性时会更改。