pythonic方式装饰类方法

时间:2018-05-07 13:21:18

标签: python python-decorators

给出以下示例:

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方式来做到这一点?

2 个答案:

答案 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,装饰器g10添加到传递给它的函数的返回结果中。但是,为了能够保存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