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

1 投票
3 回答
2884 浏览
提问于 2025-04-18 12:01

可以把一个变量设置为一个函数返回的值吗?在下面的例子中,我希望 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
>>>

撰写回答