从一系列字符串中调用类中的方法

时间:2017-12-21 07:47:52

标签: python python-3.x

从一系列字符串中,我试图在类中调用方法。 不幸的是,该方法没有被正确调用,因为它需要self来表明它是类的内部。我该如何修复这个逻辑?

class SomeClass(object):
    def apply(self):
        rules = [{'action': 'replace'}, {'action': 'split'}, {'action': 'remove'}]
        return [eval('_perform_' + r['action'])() for r in rules
              if r['action'] in ['replace', 'split', 'remove']]

    def _perform_replace(self):
        print("performing replace")

    def _perform_split(self):
        print("performing split")

    def _perform_remove(self):
        print("performing remove") 

SomeClass().apply()

这引发以下异常:

  

NameError:未定义名称“_perform_replace”

2 个答案:

答案 0 :(得分:3)

您应该使用self来调用实例方法。因此,请将apply功能更改为

  def apply(self):
        rules = [{'action': 'replace'}, {'action': 'split'}, {'action': 'remove'}]
        return [eval('self._perform_' + r['action'])() for r in rules
              if r['action'] in ['replace', 'split', 'remove']]

注意:使用eval是一种不好的做法。您可以找到原因here

您可以改用getattr

例如(此示例仅用于说明getattr的工作方式)

class SomeClass(object):
    def apply(self):
        method_to_be_called = "_perform_replace"
        SomeClass.method_caller(method_to_be_called)(self)
        # Invoke like this if you want your function to accept args.
        # SomeClass.method_caller(method_to_be_called, args1, args2,...)(self)

    def _perform_replace(self):
        print("performing replace")

    def _perform_split(self):
        print("performing split")

    def _perform_remove(self):
        print("performing remove")

    @staticmethod
    def method_caller(name_, *args, **kwargs):
        def caller(obj):
            return getattr(obj, name_)(*args, **kwargs)

        return caller

答案 1 :(得分:0)

您的示例有点参与,但如果您想根据某些逻辑调用函数,则可以像使用指针一样使用该函数。这是一个例子:

class SomeClass(object):
    @staticmethod
    def apply():
        rules = [{'action':SomeClass.test()}]
        return rules[0]['action']

    @staticmethod
    def test():
        print("test")


SomeClass.apply()
>test

我不确定您是否熟悉staticmethods,但如果您的功能可以自行生活,您可以decorate将您的功能设置为静态,以便随时随地调用它们。