我有两个带有函数的类:
from functools import partial
class A:
def __init__(self, collection):
self.collection = collection
def filter(self, val):
for element in self.collection:
if element.var == val:
return element
class B:
def __init__(self, var):
self.var = var
def test(self):
print('Element with variable ', self.var)
现在,我想要一个可以在对象上调用一个函数的类,该类可以由另一个函数动态获取,它们既存储在变量中,又在调用某个函数时全部执行:
class C:
def __init__(self, fetch, function):
self.fetch = fetch
self.function = function
def run(self):
global base
# -----
# This is the code I need
base.fetch().function()
# ... and currently it's completely wrong
# -----
c = C(partial(A.filter, 5), B.test)
base = A([B(3), B(5), B(8)])
c.run()
应打印:Element with variable 5
答案 0 :(得分:3)
您应该将base
传递到run
中,而不要弄乱global
。 base
没有fetch
方法,因此您必须使用属性fetch
调用作为属性的base
函数。然后,您可以将该调用的返回值发送到function
。
您还将partial
应用于A.filter
略有错误。位置参数是按顺序应用的,因此partial(A.filter, 5)
将尝试将5
绑定到self
,这将使所有内容丢掉。取而代之的是,我们需要为其指定要绑定5
的参数的名称。
class C:
def __init__(self, fetch, function):
self.fetch = fetch
self.function = function
def run(self, a):
return self.function(self.fetch(a))
c = C(partial(A.filter, val=5), B.test)
c.run(A([B(3), B(5), B(8)]))
# Element with variable 5