Python:如何向属性获取器传递多个参数?

95 投票
8 回答
77172 浏览
提问于 2025-04-16 16:01

考虑下面这个例子:

class A:
    @property
    def x(self): return 5

所以,当然调用 a = A(); a.x 会返回 5

但是想象一下,你希望能够修改属性 x。
这样的话,比如:

class A:
    @property
    def x(self, neg = False): return 5 if not neg else -5

然后用 a = A(); a.x(neg=True) 来调用它

这会引发一个类型错误:'int' object is not callable,这很正常,因为我们的 x 被计算成了 5

所以,我想知道如果可能的话,如何能给属性获取器传递多个参数。

8 个回答

22

一个属性应该只依赖于相关的对象。如果你想使用一些外部的参数,那就应该用方法来处理。

60

我觉得你没有完全理解属性的用途。

如果你创建了一个属性 x,你会通过 obj.x 来访问它,而不是用 obj.x()。创建了属性后,直接调用底层的函数就不太容易了。

如果你想传递参数,可以把你的方法命名为 get_x,并且不要把它设为属性:

def get_x(self, neg=False):
    return 5 if not neg else -5

如果你想创建一个设置器,可以这样做:

class A:
    @property
    def x(self): return 5

    @x.setter
    def x(self, value): self._x = value
106

注意,你并不一定要把property当作装饰器来用。你可以照旧用老办法,除了使用属性外,还可以单独暴露出各个方法:

class A:
    def get_x(self, neg=False):
        return -5 if neg else 5
    x = property(get_x)

>>> a = A()
>>> a.x
5
>>> a.get_x()
5
>>> a.get_x(True)
-5

这是否是个好主意,取决于你具体在做什么(不过如果我在审查代码时看到这种写法,我希望能在注释中看到很好的理由)

撰写回答