我试图了解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
不知道它为什么告诉我。有人能给我指出正确的方向吗?在
你很困惑你的代码在做什么。在
它不赋值类,它创建一个实例,并将该实例赋给一个变量:
这将调用该实例上的方法:
^{pr2}$下面告诉您没有全局函数(或任何类型的变量)
parse_verb
:我希望您希望将其更改为
verb = self.parse_verb(word_list)
,这将调用同一对象(self
)的parse_verb
方法。在这里有两个问题,一个是机械问题,一个是概念问题。我先处理后者。在
类的全部意义在于,它的实例代表世界模型中的某种对象。例如,一个“句子”是一个对象,所以有一个名为
Sentence
的类是有意义的,但是“解析器”不是一个对象,所以Parsers
可能是一个混乱的类。从抽象的角度来看,类通常有某种状态,封装在它的方法所处理的数据成员中。在这里真正拥有的是一个解析器函数,它返回一个
Sentence
对象(或引发一个ParserError
)。这个函数可以是Sentence
的方法,也可以是一个自由函数;如果模型中存在这样一个对象的任何原因,那么它也可以是Parser
类的方法,但似乎没有理由。在如果您只是想封装所有这些helper函数,这样它们就不会丢弃全局名称空间(这本身是个好主意),那么您不需要滥用类来实现这一点。{{cd7>把它们放在模块中。在
现在,讨论机械问题:如果类中有一个方法,通常只通过点语法来调用它:
someObject.methodName(params)
。当一个方法调用同一对象的另一个方法时,您可以使用特殊的self
参数(已正确地将其列为每个方法的第一个参数)来执行此操作。所以:…等等。在
不是每种语言都需要这样的显式
self
。例如,在C++或相关语言(java,C++等)中,一种方法可以调用另一种方法而不指定目标,它隐含地假定目标是^ {CD12}}(C++等价的^ {CD10}})。在看起来您是在python交互会话中工作的。在
如果在导入
parser2
后对parser2.py
进行了任何更改,则必须使交互解释器知道这些更改。在
相关问题 更多 >
编程相关推荐