Python 从一系列字符串调用类内的方法
从一系列字符串中,我试图调用类内的方法。 不幸的是,该方法没有被正确调用,因为它需要Python 从一系列字符串调用类内的方法,python,python-3.x,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
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()
这将引发以下异常:
名称错误:未定义名称“\u执行\u替换”
您应该使用
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
是一种不好的做法。你可以找到原因
您可以改为使用getattr
例如(此示例仅说明getattr
是如何工作的)
您应该使用
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
是一种不好的做法。你可以找到原因
您可以改为使用getattr
例如(此示例仅说明getattr
是如何工作的)
你的例子有点复杂,但是如果你想根据一些逻辑调用函数,你可以像指针一样使用函数。以下是一个例子:
class SomeClass(object):
@staticmethod
def apply():
rules = [{'action':SomeClass.test()}]
return rules[0]['action']
@staticmethod
def test():
print("test")
SomeClass.apply()
>test
我不确定您是否熟悉
staticmethods
,但是如果您的函数可以独立使用,您可以将您的函数修饰为静态,以便从任何地方调用它们 您的示例有点复杂,但是如果您想基于某些逻辑调用函数,您可以像使用指针一样使用该函数。以下是一个例子:
class SomeClass(object):
@staticmethod
def apply():
rules = [{'action':SomeClass.test()}]
return rules[0]['action']
@staticmethod
def test():
print("test")
SomeClass.apply()
>test
我不确定您是否熟悉staticmethods
,但是如果您的函数可以独立使用,您可以将您的函数修饰为静态,以便从任何地方调用它们 如果要访问staticmethods
,必须使用decorator
将类定义为静态成员函数。然后像调用SomeClass.apply()
一样调用它,而不使用()
。此外,如果您尝试在python中拆分/转义字符串,有比您尝试执行的操作简单得多的方法。您能详细说明一下吗?我知道有一些简单的方法,但这里我的规则列表实际上是一个json文件,包含几个特定于域的规则。-replace/split/remove更为复杂,需要与pandas数据帧进行交互。我没有解释这一点,只是为了关注问题的核心。您可以使用getattr访问对象的属性等方法。因此,在apply方法内部,您可以使用getattr(self,“\u perform”+r['action'])(),
@Michael当前接受的答案只会将其封装在静态方法中。我想说,安全性没有区别,因为两者都使用getattr
。避免使用eval始终是一个好主意。:)@Michael我认为这是一个非常好的例子,说明函数在Python中是如何成为一流公民的。方法只是以实例作为第一个参数调用的函数。和方法是类/实例的属性。如果要访问staticmethods
,必须使用decorator
将类定义为静态成员函数。然后像调用SomeClass.apply()
一样调用它,而不使用()
。此外,如果您尝试在python中拆分/转义字符串,有比您尝试执行的操作简单得多的方法。您能详细说明一下吗?我知道有一些简单的方法,但这里我的规则列表实际上是一个json文件,包含几个特定于域的规则。-replace/split/remove更为复杂,需要与pandas数据帧进行交互。我没有解释这一点,只是为了关注问题的核心。您可以使用getattr访问对象的属性等方法。因此,在apply方法内部,您可以使用getattr(self,“\u perform”+r['action'])(),
@Michael当前接受的答案只会将其封装在静态方法中。我想说,安全性没有区别,因为两者都使用getattr
。避免使用eval始终是一个好主意。:)@Michael我认为这是一个非常好的例子,说明函数在Python中是如何成为一流公民的。方法只是以实例作为第一个参数调用的函数。和方法是类/实例的属性。为此,您可以为我的示例提出一种风险较小的eval
替代方案吗?谢谢,如果apply
需要将参数传递给\u perform
方法,那么这些参数将像这样传递SomeClass.method\u caller(method\u to\u be\u called)(self,a,b)
我接受了你的答案,因为它直接符合我当前的逻辑,但也提供了更好的解决方案!谢谢您的大力支持。@Michael更正:如果apply
需要将参数传递给\u perform
方法,那么这些参数应该像SomeClass.method\u调用者(method\u to\u被调用,a,b)(self)
而不是SomeClass.method\u调用者(method\u to\u被调用)(self,a,b)
,谢谢您的支持,对于我的例子,你能提出一个风险较小的eval
替代方案吗?谢谢,如果apply
需要将参数传递给\u perform
方法,那么这些参数会这样传递吗SomeClass.method\u caller(method\u to\u be\u called)(self,a,b)
我接受了你的答案,因为它直接符合我当前的逻辑,但也提供了更好的解决方案!谢谢您的大力支持。@Michael更正:如果apply
需要将参数传递给\u perform
方法,那么这些参数应该像SomeClass.method\u调用者(method\u to\u被调用,a,b)(self)
而不是SomeClass.method\u调用者(method\u to\u被调用)(self,a,b)
。