按需执行存储在变量中的类函数

时间:2018-07-09 13:39:30

标签: python python-3.x function class functools

我有两个带有函数的类:

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

1 个答案:

答案 0 :(得分:3)

您应该将base传递到run中,而不要弄乱globalbase没有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