Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从一系列字符串调用类内的方法_Python_Python 3.x - Fatal编程技术网

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)