python常量修饰符在应用于函数时不接受self

2024-05-15 08:31:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了一个像这样的装饰

def constant(f):
  def fset(self, value):
    raise TypeError
  @wraps(f)
  def fget(self):
    return f()
  return property(fget, fset)

但是当我在一个函数上使用它并调用它时,我会因为没有传递足够的参数而抛出一个类型错误,我以为添加wrapps decorator可以解决这个问题,但事实并非如此

^{pr2}$

下面是我如何测试它的,我不明白我做错了什么,主要是为什么self没有被自动传入,因为包装。我可能误解了wrapps的可怕之处。在

    >>> from irrigationservice.irrigation import IrrigationAmount
>>> a = IrrigationAmount(0.12, 0.2)
>>> a.calculate()
>>> a.value
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/krishna/Documents/irrigationwebserver/webserver/irrigationservice/utils.py", line 12, in fget
    return f()
TypeError: value() takes exactly 1 argument (0 given)

Tags: inselfreturnvaluedefserviceline装饰
2条回答

我想您应该用这样的方法替换常量函数定义和@constant修饰符:

@property
def value(self):
    """return the protected value"""
    return self._value

编辑:添加以下示例以解决一些注释

创建文件我的值.py... 在

^{pr2}$

现在在python中运行:

>>> from myvalue import MyValue
>>> z = MyValue(2, 3)
>>> z.value
0
>>> z.calculate()
>>> z.value
6
>>> z.value = 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

虽然Steve's answer是正确的方法(当@property自然为只读时,您不需要特殊的@constant修饰符,除非您显式地用@propname.setter修饰其他方法),但出现问题的原因是修饰类方法没有绑定,并且没有显式地将self传递给它。在

将代码更改为:

def fget(self):
    return f(self)

所以self参数实际上去了它应该去的地方。在

相关问题 更多 >