我需要一个代表班?

时间:2015-03-03 11:25:12

标签: python python-3.x

我有一个听起来像委托问题的问题。我有一个如下代码:

class foo(object):
    def __init__(self,onEvent1="", onEvent2=""):
        self.OnEvent1=onEvent1
        self.OnEvent1=onEvent2

    def aLoop(self):
        ...
        #in case of event1
        self.OnEvent1()
        ...
        #in case of event2
        self.OnEvent2()


EventType=0

def MyBar1():
    print("Event Type1")
    EventType=1

def MyBar2():
    print("Event Type2")
    EventType=2

myFoo=foo(MyBar1,MyBar2)

while True:
    myFoo.aLoop()
    if (EventType==1):
        print ("EventType is 1")
        EventType=0
    elif (EventType==2):
        print ("EventType is 2")
        EventType=0

我可以在回调函数中看到print()的消息,但不能看到while循环中消息的print()。 变量EventType不会改变其值。

我能做什么?

2 个答案:

答案 0 :(得分:1)

EventType=0

def MyBar1():
    global EventType
    print("Event Type1")
    EventType=1

def MyBar2():
    global EventType
    print("Event Type2")
    EventType=2

问题是,您需要修改全局变量,但您要创建本地变量。您仍然可以访问全局变量,而无需使用global variable。你需要这个修改它。

答案 1 :(得分:1)

EventTypeMyBar1中的MyBar2个变量是局部变量。除非另外明确配置,否则绑定到的任何变量都是本地变量;赋值,函数参数,函数或类定义以及import的名称都是绑定名称的方法。

您需要使用global语句来更改此内容:

def MyBar1():
    global EventType
    print("Event Type1")
    EventType=1

def MyBar2():
    global EventType
    print("Event Type2")
    EventType=2

请注意,为您的事件参数提供一个空字符串作为默认参数几乎没有意义:

def __init__(self,onEvent1="", onEvent2=""):

如果它们是可选的,请将它们设置为None并测试:

def __init__(self, onEvent1=None, onEvent2=None):
    self.OnEvent1 = onEvent1
    self.OnEvent2 = onEvent2

def aLoop(self):
    ...
    #in case of event1
    if self.OnEvent1 is not None:
        self.OnEvent1()
    ...
    #in case of event2
    if self.OnEvent2 is not None:
        self.OnEvent2()