我使用Python并且我有两个类。我想为一个类导入一个函数,但是能够向该函数添加东西。
class Main(self):
def __init__(self):
thingstodo()
def function(self, keypressed):
#LOTS OF CODE
keyname = keypressed
if keyname = "Escape":
dosomething()
class Main2(Main):
def __init(self):
Main.__init__(self)
def function(self, keypressed):
Main.function(self, keypressed)
if keyname = "control":
dootherthing()
答案 0 :(得分:1)
您无法从另一个函数中的一个函数(或方法)访问局部变量。这是设计的。
此class Main(self):
错误。在Python 3中class Main:
。虽然使用self
作为方法中第一个参数的名称是强约定,但self
只是普通名称而不是保留关键字或内置。
这里有几个问题:
def __init(self):
Main.__init__(self)
一个。方法名称需要__init__()
而不是__init
。
湾请勿使用Main.__init__(self)
使用super().__init__()
对父类的名称进行硬连线。
℃。如果您在__init__()
Main2
中没有执行任何额外操作,则根本不需要实施__init__()
。
对于您的问题,使用按键的字典按键名称作为键,操作的函数作为值似乎很有用。
首先定义一些小辅助函数:
def thingstodo():
print('thingstodo')
def dosomething():
print('something')
def dootherthing():
print('dootherthing')
现在是你的主要课程:
class KeyAction: # Python 3
def __init__(self):
thingstodo()
self.key_actions = {'Escape': dosomething}
def handel_key_press(self, keypressed):
#LOTS OF CODE
keyname = keypressed
func = self.key_actions.get(keyname)
if func is not None:
func()
名称很重要,因此我使用KeyAction
代替Main
。
这一行self.key_actions = {'Escape': dosomething}
是此解决方案的核心。这里self.key_actions
是一个字典,用于将按键事件的名称映射到函数。注意dosomething
没有()
,因为我将函数对象放入字典而不是调用此函数。
调用此函数有点不同:
func = self.key_actions.get(keyname)
if func is not None:
func()
我使用字典的get()
方法。如果密钥在密钥中,则返回密钥的值,否则返回None
。如果密钥为func
或dosomething
,则Escape
会保留对函数None
的引用。如果它是一个函数,我用func()
调用它。
此处的替代方案可以是try
- except
:
def handel_key_press(self, keypressed):
#LOTS OF CODE
keyname = keypressed
try:
self.key_actions[keyname]()
except KeyError:
pass
现在,在您的子类中,您只需要向self.key_actions
添加另一个键值对即可扩展其功能:
class ExtendedKeyAction(KeyAction):
def __init__(self):
super().__init__()
self.key_actions['control'] = dootherthing
制作两个实例并测试您的代码:
key_action = KeyAction()
key_action.handel_key_press('Escape')
key_action.handel_key_press('undefined')
extended_key_action = ExtendedKeyAction()
extended_key_action.handel_key_press('Escape')
extended_key_action.handel_key_press('control')
extended_key_action.handel_key_press('undefined')
打印:
thingstodo
something
thingstodo
something
dootherthing