覆盖没有继承的类方法(python)

Ale*_*kov 3 python

首先,如果你们认为我尝试做事的方式不是Pythonic,请随意提供其他建议.

我有一个对象,其功能需要根据外部事件进行更改.我最初做的是创建一个继承自原始对象的新对象(让我们调用它OrigObject())并覆盖更改的方法(让我们调用新对象NewObject()).然后我修改了两个构造函数,以便它们可以接受另一个类型的完整对象,以根据传入的对象填充自己的值.然后,当我需要更改功能时,我只是执行myObject = NewObject(myObject).

我现在开始看到这种方法的几个问题.首先,需要更新引用该对象的其他位置以引用新类型(例如,上述语句只会更新本地myObject变量).但是这并不难更新,只有烦人的部分才会记住每次更改对象时在其他地方更新它以防止奇怪的程序行为.

其次,我注意到我需要NewObject()中的单个方法的场景,但是来自OrigObject()的其他方法,我需要能够动态切换功能.它似乎不再是使用继承的最佳解决方案,我需要在M*N中创建不同的类(其中M是类可以改变的方法数,N是变化的数量)每个方法)继承自OrigObject().

我正在考虑使用属性重映射,但我似乎遇到了问题.例如,说我有这样的事情:

def hybrid_type2(someobj, a):
    #do something else
    ...

class OrigObject(object):
    ...
    def hybrid_fun(self, a):
        #do something
        ...

    def switch(type):
        if type == 1:
            self.hybrid_fun = OrigObject.hybrid_fun
        else:
            self.fybrid_fun = hybrid_type2
Run Code Online (Sandbox Code Playgroud)

问题是,在执行此操作并尝试在切换后调用新的hybrid_fun之后,我得到一个错误,说hybrid_type2()只接受2个参数,但我将其传递给它.该对象似乎不再将其自身作为新函数的参数传递,就像它使用自己的方法一样,我可以采取哪些措施来解决这个问题?

我尝试在类中包含hybrid_type2然后使用self.hybrid_fun = self.hybrid_type2作品,但是使用self.hybrid_fun = OrigObject.hybrid_fun会导致类似的错误(抱怨第一个参数应该是OrigObject类型).我知道我可以OrigObject.hybrid_fun()在内部定义逻辑,OrigObject.hybrid_type1()所以我可以像设置它一样恢复它(相对于实例,而不是相对于类,以避免对象不是第一个参数).但是我想在这里询问是否有更清洁的方法,我没有在这里看到?谢谢

编辑:谢谢大家,我已经给出了一些效果很好的解决方案.我基本上最终使用了一个使用types.MethodType()的策略模式,我接受了解释如何在python中执行策略模式的答案(维基百科文章更通用,Python中不需要使用接口) .

Dun*_*nes 5

使用 types 模块为特定实例创建实例方法。

例如。

import types

def strategyA(possible_self):
    pass

instance = OrigObject()

instance.strategy = types.MethodType(strategyA, instance)

instance.strategy()
Run Code Online (Sandbox Code Playgroud)

请注意,这仅影响该特定实例,不会影响其他实例。