给出以下示例:
class A:
def f(self, x):
return 2*x
我想写另一种方法,它使用上面的f
但添加一个常量,即
class A:
def f(self, x):
return 2*x
def g(self, x):
return self.f(x) + 10
这将是一种方式。然而,这闻起来非常像装饰!什么是适当的pythonic方式来做到这一点?
答案 0 :(得分:0)
扩展@ Ajax1234的答案,您可以尝试:
- 参数化你的装饰师,
- 明确地调用你的装饰者(没有@
)。
def add_val(_value):
def decorator(f):
def wrapper(cls, _x):
return f(cls, _x) + _value
return wrapper
return decorator
class A:
def f(self, x):
return 2*x
g = add_val(10)(f)
[编辑]
您还可以使用functools.wraps()
(装饰器本身)改进装饰器。您需要做的就是更改包装器声明:
@functools.wraps(f)
def wrapper(cls, _x):
return f(cls, _x) + _value
答案 1 :(得分:-1)
你可以在课外写一个简单的函数:
def add_val(f):
def wrapper(cls, _x):
return f(cls, _x) + 10
return wrapper
class A:
@add_val
def f(self, x):
return 2*x
print(A().f(20))
输出:
50
修改:您可以在Python3中使用functools.wraps
classmethod
。包装函数f
将返回x*2
,装饰器g
将10
添加到传递给它的函数的返回结果中。但是,为了能够保存f
的原始功能,您可以使用__wrapped__
属性:
import functools
def g(f):
@functools.wraps(f)
def wrapper(cls, _x):
return f(cls, _x)+10
return wrapper
class A:
@classmethod
@g
def f(cls, x):
return x*2
f_1 = functools.partial(A.f.__wrapped__, A)
print(A.f(4))
print(f_1(4))
输出:
18
8