Pythonグローバル変数とその正しい使用法の理解に問題があります。コードの最初のビットは正常に機能し、2番目のビットは「NameError:グローバル名'選択された'が定義されていません」という例外をスローします。ここでは単純なものが欠けていると思いますが、それが何であるかはわかりません。
リスナーを多くのイベントジェネレーターのそれぞれに関連付けてから、getChoicesメソッドを使用して、各ジェネレーターで選択された辞書を取得したいと思います。
#Working code
class Listener1():
chosen = "0"
def __init__(self, choice):
self.choice = choice
def actionPerformed(self, event):
global chosen
chosen = self.choice
@staticmethod
def getChoices():
return chosen
e1 = Listener1('evt1')
e1.actionPerformed('abc')
print Listener1.getChoices()
失敗したコード
class Listener2():
chosen2 = {'a':-1}
def __init__(self, choice):
self.choice = choice
global chosen2
chosen2[self.choice] = 'unset'
def actionPerformed(self, event):
val = event
global chosen2
chosen2[self.choice] = val
@staticmethod
def getChoices():
return chosen2
e2 = Listener2('evt2')
e2.actionPerformed('def')
e3 = Listener2('evt3')
e3.actionPerformed('ghi')
print Listener2.getChoices()
脚注:グローバル変数chosen2への最初の参照をクラス定義の後の行ではなく前の行に移動すると、Listener2クラスは正しく機能します。
以下の回答のおかげで、コードは次のように書き直されました。
class Listener3():
chosen3 = {}
def __init__(self, choice):
self.choice = choice
if choice is not None:
self.chosen3[self.choice] = 'unset'
def actionPerformed(self, event):
val = event
self.chosen3[self.choice] = val
def getChoices(self):
return self.chosen3
e1 = Listener3('evt1')
e1.actionPerformed('abc')
e2 = Listener3('evt2')
e2.actionPerformed('def')
e3 = Listener3('evt3')
print Listener3(None).getChoices()
{'evt1': 'abc', 'evt2': 'def', 'evt3':'unset'}
そして、はるかに単純であることは別として、今では完璧に機能しています。