我一直在寻找一种方法,我们可以修改python中现有的staticmethod
装饰器以添加自定义行为。比如说,每次使用静态方法时,都会调用类中的另一个方法。
我遇到了MongoDB的问题,需要调用一个方法来手动设置集合名称。
以下几点描述了我遇到的问题:
- 我做了一个数据库类,它充当
pymongo
的包装器
我 - 创建了 2 个类,它们使用我创建的数据库类来与
MongoDB
进行交易 集合名称作为静态变量
分配给每个类示例:- 用户类的集合名称 -> 用户,
- 测验类的集合名称 -> 测验
数据库类(包装器(维护了它自己的集合名称
static variable
,该名称由在它的帮助下进行交易所需的任何类分配。问题:每当我首先为Quiz类进行事务时,它都会将集合名称分配给数据库类,但是一旦我与用户类进行交易,就会使用测验类的集合名称。
我在这些类中使用静态方法进行交易,我想到的解决方案是修改 staticmethod,每次调用静态方法时它都会自动将集合名称重新分配给数据库类。
创建一个调用staticmethod
的新装饰器。我认为这会起作用。
def customstatic(fun):
def decorator(*args, **kwargs):
def wrapper():
return fun(*args, **kwargs)
# do custom stuff here
return staticmethod(wrapper)
return decorator
为@blueteeth的答案添加替代方案。
这行得通,但大多数棉绒会抱怨它。
def custom_method(func):
@staticmethod
def static(*args, **kwargs):
# do stuff
func(*args, **kwargs)
return static