从一系列字符串中,我试图在类中调用方法。
不幸的是,该方法没有被正确调用,因为它需要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”
答案 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
将您的功能设置为静态,以便随时随地调用它们。