Python 如何将实例方法调用传递给实例属性?
是否有一种方法可以将除指定的几个实例调用之外的所有实例调用传递给实例的属性?我试图找出为Python 如何将实例方法调用传递给实例属性?,python,class,instance-methods,Python,Class,Instance Methods,是否有一种方法可以将除指定的几个实例调用之外的所有实例调用传递给实例的属性?我试图找出为PyMongo编写包装器类的最简单方法,如下所示: class Mongo(): def __init__(self, db_name, collection_name): self.client = MongoClient() self.collection = self.client[db_name][collection_name] 如果有一种方法可以说将
PyMongo
编写包装器类的最简单方法,如下所示:
class Mongo():
def __init__(self, db_name, collection_name):
self.client = MongoClient()
self.collection = self.client[db_name][collection_name]
如果有一种方法可以说将所有self.function调用传递给self.collection,那就太好了,除非您正在调用此列表中的某个对象:[uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。是否有语言功能允许我这样做?我能想到的唯一一件事就是对\uuuuu call\uuuuu
做一些事情,其中函数名将是传递给\uuuu call\uuuuu
的值,但似乎在处理不同数量和类型的参数时会变得很危险。我的设想是:
def __call__(self, value, *args, **kargs):
func = getattr(self.test, value)
func(self.test, *args, **kargs)
我还没有让上面的工作。特别是,我传递了太多的论点。通过args,kargs
或*args,**kargs
并没有按照我所希望的方式解决问题我需要做什么才能将用户指定的任何参数传递给用户指定的任何函数?(问题末尾粘贴完整的最小工作示例)
然而,即使我可以让上面的工作,符号是笨重的。我真的希望能够做一些更像:
f.f1(4,5)
而不是
f("f1", 4, 5)
即使我可以让它按预期工作,是否还有更好的替代方案来替代上述\uuuu调用\uuuuu
场景?
以下是不起作用的代码:
class test1():
def __init__(self, test):
self.test = test
def __call__(self, value, *args, **kargs):
func = getattr(self.test, value)
func(args, kargs)
class test2():
def f1(a, b):
print(a+b)
def f2(stringy):
print(stringy)
def f3(a = 7, b = 14):
print("a is %d and b is %b"%(a,b))
def main():
t2 = test2()
t1 = test1(t2)
t1("f1",4, 5) #gives an error that I am passing 3 args instead of the 2 specified by func definition
if __name__ == "__main__":
main()
通过在类上定义\uuu getattr\uuu
可以非常简单地拦截属性访问。每当您访问该实例中实际不存在的属性时,就会调用该函数;因此,您可以将它们传递到self.collection
甚至不需要区分方法和其他属性;访问在调用之前完成,因此返回集合的方法将允许Python做正确的事情
def __getattr__(self, attr):
return getattr(self.collection, attr)
非常感谢这个简单得多的解决方案。在这里,性能对我来说并不重要,所以我不担心,但总的来说,这样做会带来性能上的冲击吗?