Python:如何向属性获取器传递多个参数?
考虑下面这个例子:
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
这是否是个好主意,取决于你具体在做什么(不过如果我在审查代码时看到这种写法,我希望能在注释中看到很好的理由)