【问题标题】:How create decorator inside a class?如何在类中创建装饰器?
【发布时间】:2020-09-05 18:42:05
【问题描述】:

我想创建一个简单的装饰器函数,在输入函数之前添加一些方法。 举个例子:

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)

但我有错误:

"beforeWriteOracle() 缺少 1 个必需的位置参数:'func'"

如何为我的案例正确使用装饰器?

谢谢

【问题讨论】:

    标签: python class decorator


    【解决方案1】:

    您不需要(或不想)将func 作为参数传递给包装器;包装器应该采用与您正在装饰的函数相同的参数,因为它将“成为”该函数。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 2018-07-27
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多