Python命令模式使用执行和实例变量

时间:2016-12-13 20:24:03

标签: python python-2.7

我正在尝试编写一个指挥官类,但无法让它正常工作:

#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。我不懂什么?

2 个答案:

答案 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作为您班级的属性。