从类继承函数但编辑该函数

时间:2015-12-26 21:17:22

标签: python oop inheritance python-3.5

我使用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()

1 个答案:

答案 0 :(得分:1)

基本原则

  1. 您无法从另一个函数中的一个函数(或方法)访问局部变量。这是设计的。

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

  3. 这里有几个问题:

    def __init(self):
        Main.__init__(self)
    

    一个。方法名称需要__init__()而不是__init

    湾请勿使用Main.__init__(self)使用super().__init__()对父类的名称进行硬连线。

    ℃。如果您在__init__() Main2中没有执行任何额外操作,则根本不需要实施__init__()

  4. 可能的解决方案

    对于您的问题,使用按键的字典按键名称作为键,操作的函数作为值似乎很有用。

    首先定义一些小辅助函数:

    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。如果密钥为funcdosomething,则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