对不起我的英语。我想创建一个decorator方法,它可以检查每个step方法并将其编写为db。在
这是我的方法:
class Test:
@StepStatusManager.logger_steps("GET_LIST") # TypeError: logger_steps() missing 1 required positional argument: 'type'
def get_mails(self):
print("GET_MAIL")
这是我的装饰课:
^{pr2}$
Tags:
您试图直接从类}。您应该创建一个
StepStatusManager
调用实例方法logger_steps
,而Python将值"GET_LIST"
作为self
参数,而不是{StepStatusManager
的实例,然后让decorator调用该实例的方法。它可以简单到:这是在创建类的实例,然后在实例上调用方法,而不是直接从类调用方法。现在可以使用
manager
来修饰任意多个方法。另外,这将使所有修饰的方法使用相同的StepStatusManager
,但如果您愿意,您可以创建不同的实例并使用它们来修饰不同的方法;这将允许您在需要时为不同的方法使用不同的self.db
。在另一种方法是在类中使用
^{pr2}$db
变量,并将logger_steps
改为class method:但是请注意,这是不够灵活的,因为它不允许您使用不同的管理器装饰方法,如果您需要的话。另外,这通常相当于使用
StepStatusManager
模块,其中db
是模块变量,logger_steps
是模块函数,如果您想要这个功能,这可能会更清楚:同样,这可能更直接,但不如第一个建议的基于类的解决方案灵活。在
编辑:
为了完整性和比较性,这里还有另一个版本,类似于带有^{} 的版本,但是使用了^{} (要了解这两个装饰器之间的细微差别,请检查其中一个关于它的问题,例如What is the difference between @staticmethod and @classmethod?或Meaning of @classmethod and @staticmethod for beginner?):
由于它经常发生在}之间,所以差别非常小。如果使用继承,或者使用元类、decorator或诸如此类的东西,它们的行为可能会有所不同,但在其他方面它们几乎相同。在
@classmethod
和{相关问题 更多 >
编程相关推荐