python:`__ init__'的装饰器是如何工作的?

时间:2017-10-25 14:37:07

标签: python

给定功能

@mydecorator
def f(x):
    ...
f(5)

我可以删除装饰器并将该函数调用为

mydecorator(f)(5)

这如何转化为对象方法?特别是__init__ ??

例如,我创建了一个装饰器

class TestClass:
    @mydecorator
    def __init__(self, x, y):
        ...

修改传递给__init__的参数。我想删除它,并仅在我想要的实例上手动应用

  • 这样做的合适语法是什么? (例如,像myinstance = mydecorator(TestClass)(...)
  • __new__之前调用__init__会影响行为吗?

1 个答案:

答案 0 :(得分:1)

装饰器并没有真正修改参数。它只是一个高阶函数,它返回给定函数的函数。你可以这样做

def make_cooler_init(init):
    def new_function(*args):
        init(*args)
        print(args)
    return new_function

使用

class TestClass:
    @make_cooler_init
    def __init__(self, x, y):
        self.x = x
        self.y = y

这只会在调用init后更改函数来打印参数,它不会有太大变化。要仅修改某些实例的行为,您可以在装饰器中处理它,因为您可以访问参数和默认函数。

def make_cooler_init(init):
    def new_function(*args):
        if args[1] == 'True':
            init(*args)
        else:
            print(args)
    return new_function