简体   繁体   English

如何在 class 中创建装饰器?

[英]How create decorator inside a class?

I want create a simple decorator function that get in input a func e add some methode before.我想创建一个简单的装饰器 function 在输入函数之前添加一些方法。 Here an example:这里有一个例子:

class A:

    def beforeWriteOracle(func):
        def wrapper(self, func):
            self.dbOracle.truncateTable(self.oracle_final_table)
            func(self.mylist)
        return wrapper

    @beforeWriteOracle
    def writeDataToOracle(self, writeDataToOracleRequestList): 
        return self.executeMethod(self.writeDataToOracleImpl, writeDataToOracleRequestList, threaded, False)

    self.writeDataToOracle(self, writeDataList)

but i have error:但我有错误:

"beforeWriteOracle() missing 1 required positional argument: 'func'" “beforeWriteOracle() 缺少 1 个必需的位置参数:‘func’”

How use correctly decorator for my case?如何为我的案例正确使用装饰器?

thanks谢谢

You don't need to (or want to) pass func as an argument to the wrapper;您不需要(或不想)将func作为参数传递给包装器; the wrapper should take the same arguments that function you are decorating takes, since it's going to "become" that function.包装器应该采用与您正在装饰的 function 相同的 arguments,因为它将“变成”function。

func itself is available as a non-local variable inside wrapper , which is a closure : it retains the value passed to beforeWriteOracle even after beforeWriteOracle exits. func本身可以作为wrapper内部的非局部变量使用,这是一个闭包:即使在beforeWriteOracle退出之后,它也会保留传递给beforeWriteOracle的值。

def beforeWriteOracle(func):
    def wrapper(self, *args, **kwargs):
        self.dbOracle.truncateTable(self.oracle_final_table)
        func(self, *args, **kwargs)
    return wrapper


@beforeWriteOracle
def writeDataToOracle(self, writeDataToOracleRequestList):
    return self.executeMethod(self.writeDataToOracleImpl, writeDataToOracleRequestList, threaded, False)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM