从 class 继承函数但编辑该函数
Inheritance of function from class but editing that function
我正在使用 Python 并且我有两个 class。我想为 class 导入一个函数,但可以向该函数添加内容。
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()
基本原则
您不能从一个函数(或方法)在另一个函数中访问局部变量。这是设计使然。
这个class Main(self):
是错误的。在 Python 3 中执行 class Main:
。虽然使用 self
作为方法中第一个参数的名称是 strong 约定,但 self
只是一个普通名称而不是保留关键字或 built-in.
这里有几个问题:
def __init(self):
Main.__init__(self)
一个。方法名称需要 __init__()
而不是 __init
.
b。不要硬连接 parent class 和 Main.__init__(self)
使用 super().__init__()
.
c。如果您在 Main2
的 __init__()
中没有做任何额外的事情,那么您根本不需要实施 __init__()
。
可能的解决方案
对于您的问题,使用以按键名称作为键并将操作函数作为值的字典似乎很有用。
先定义几个小辅助函数:
def thingstodo():
print('thingstodo')
def dosomething():
print('something')
def dootherthing():
print('dootherthing')
现在你的主要class:
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
没有 ()
因为我把函数 object 放入字典而不是调用这个函数。
调用这个函数有点不同:
func = self.key_actions.get(keyname)
if func is not None:
func()
我用的是字典的get()
方法。如果密钥在其中,则此 returns 为密钥的值,否则为 None
。如果键是 Escape
或 None
,现在 func
持有对函数 dosomething
的引用。如果它是一个函数,我用 func()
.
调用它
此处的替代方案可以是 try
-except
:
def handel_key_press(self, keypressed):
#LOTS OF CODE
keyname = keypressed
try:
self.key_actions[keyname]()
except KeyError:
pass
现在,在您的 child class 中,您只需向 self.key_actions
添加另一个 key-value 对以扩展其功能:
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
我正在使用 Python 并且我有两个 class。我想为 class 导入一个函数,但可以向该函数添加内容。
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()
基本原则
您不能从一个函数(或方法)在另一个函数中访问局部变量。这是设计使然。
这个
class Main(self):
是错误的。在 Python 3 中执行class Main:
。虽然使用self
作为方法中第一个参数的名称是 strong 约定,但self
只是一个普通名称而不是保留关键字或 built-in.这里有几个问题:
def __init(self): Main.__init__(self)
一个。方法名称需要
__init__()
而不是__init
.b。不要硬连接 parent class 和
Main.__init__(self)
使用super().__init__()
.c。如果您在
Main2
的__init__()
中没有做任何额外的事情,那么您根本不需要实施__init__()
。
可能的解决方案
对于您的问题,使用以按键名称作为键并将操作函数作为值的字典似乎很有用。
先定义几个小辅助函数:
def thingstodo():
print('thingstodo')
def dosomething():
print('something')
def dootherthing():
print('dootherthing')
现在你的主要class:
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
没有 ()
因为我把函数 object 放入字典而不是调用这个函数。
调用这个函数有点不同:
func = self.key_actions.get(keyname)
if func is not None:
func()
我用的是字典的get()
方法。如果密钥在其中,则此 returns 为密钥的值,否则为 None
。如果键是 Escape
或 None
,现在 func
持有对函数 dosomething
的引用。如果它是一个函数,我用 func()
.
此处的替代方案可以是 try
-except
:
def handel_key_press(self, keypressed):
#LOTS OF CODE
keyname = keypressed
try:
self.key_actions[keyname]()
except KeyError:
pass
现在,在您的 child class 中,您只需向 self.key_actions
添加另一个 key-value 对以扩展其功能:
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