从 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()

基本原则

  1. 您不能从一个函数(或方法)在另一个函数中访问局部变量。这是设计使然。

  2. 这个class Main(self):是错误的。在 Python 3 中执行 class Main:。虽然使用 self 作为方法中第一个参数的名称是 strong 约定,但 self 只是一个普通名称而不是保留关键字或 built-in.

  3. 这里有几个问题:

    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。如果键是 EscapeNone,现在 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