我正在尝试编写一个指挥官类,但无法让它正常工作:
#torbotCommander.py
from mongoconn import MongoConnection
class TorbotCommander(object):
excecute = {
'request': TorrentRequest,
'list': ListTorrents,
'fulfill': FulfillRequest
}
def __init__(self, TorbotCommandObj):
send(TorbotCommander.execute[TorbotCommandObj.__command](TorbotCommandObj))
def TorrentRequest(self, TorbotCommandObj):
print "request"
def ListTorrents(self, TorbotCommandObj):
print "list"
def FulfillRequest(self, TorbotCommandObj):
print "fulfill"
当我运行此文件时,我得到name 'TorrentRequest' is not defined
。我不懂什么?
答案 0 :(得分:3)
这很可能是因为你在这里调用了TorrentRequest函数:
execute = {
'request': TorrentRequest,
}
位于您在类中实际定义TorrentRequest函数之前。
答案 1 :(得分:2)
您的问题是,在您创建名称之前引用名称TorrentRequest
。 Python允许在定义之前引用方法,但引用必须在类__init__
方法内。使用一个简单的示例可以看到此行为:
# Python 2
>>> class foo(object):
... baz = bar
... def __init__(self):
... pass
... def bar(self):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
NameError: name 'bar' is not defined
>>>
有人可能会认为使用self
会起作用。它不会:
>>> class foo(object):
... baz = self.bar()
... def __init__(self):
... pass
... def bar(self):
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
NameError: name 'self' is not defined
>>>
最简单的解决方案是简单地将execute
作为您班级的属性。