在python中将函数转换为类的方法

2024-06-17 14:48:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图了解python2.6的窍门,这是我对编程语言的介绍。我正在艰难地学习Python,我一定错过了一些东西。我有一组要合并到类中的函数。这些函数包含here。我试图把这些解析器组合成一个“类”。此代码包含here。在

函数本身在类之外工作。我试着像这样调用类外的函数:

导入模块:

>>> from ex48 import parser2

分配班级:

^{pr2}$

调用函数:

>>> parser_class.parse_subject(word_list, ('noun', 'player'))

我得到以下信息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ex48/parser2.py", line 60, in parse_subject
    verb = parse_verb(word_list)
NameError: global name 'parse_verb' is not defined

不知道它为什么告诉我。有人能给我指出正确的方向吗?在


Tags: 函数in解析器hereparseline编程语言list
3条回答

你很困惑你的代码在做什么。在

它不赋值类,它创建一个实例,并将该实例赋给一个变量:

parser_class = parser2.Parsers()

这将调用该实例上的方法:

^{pr2}$

下面告诉您没有全局函数(或任何类型的变量)parse_verb

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ex48/parser2.py", line 60, in parse_subject
    verb = parse_verb(word_list)
NameError: global name 'parse_verb' is not defined

我希望您希望将其更改为verb = self.parse_verb(word_list),这将调用同一对象(self)的parse_verb方法。在

这里有两个问题,一个是机械问题,一个是概念问题。我先处理后者。在

类的全部意义在于,它的实例代表世界模型中的某种对象。例如,一个“句子”是一个对象,所以有一个名为Sentence的类是有意义的,但是“解析器”不是一个对象,所以Parsers可能是一个混乱的类。从抽象的角度来看,类通常有某种状态,封装在它的方法所处理的数据成员中。在

这里真正拥有的是一个解析器函数,它返回一个Sentence对象(或引发一个ParserError)。这个函数可以是Sentence的方法,也可以是一个自由函数;如果模型中存在这样一个对象的任何原因,那么它也可以是Parser类的方法,但似乎没有理由。在

如果您只是想封装所有这些helper函数,这样它们就不会丢弃全局名称空间(这本身是个好主意),那么您不需要滥用类来实现这一点。{{cd7>把它们放在模块中。在

现在,讨论机械问题:如果类中有一个方法,通常只通过点语法来调用它:someObject.methodName(params)。当一个方法调用同一对象的另一个方法时,您可以使用特殊的self参数(已正确地将其列为每个方法的第一个参数)来执行此操作。所以:

verb = self.parse_verb(word_list)
obj = self.parse_object(word_list)

…等等。在

不是每种语言都需要这样的显式self。例如,在C++或相关语言(java,C++等)中,一种方法可以调用另一种方法而不指定目标,它隐含地假定目标是^ {CD12}}(C++等价的^ {CD10}})。在

看起来您是在python交互会话中工作的。在

如果在导入parser2后对parser2.py进行了任何更改,则必须

reload(parser2)

使交互解释器知道这些更改。在

相关问题 更多 >