可能延迟(运行时)添加其他父类?

时间:2014-06-04 14:37:06

标签: python multiple-inheritance

这是关于多重继承。父类A提供了一些方法,B父类B提供了一些额外的方法。通过创建一个继承自A和B的类,我可以实例化一个具有两个方法集的对象。

现在我的问题是,我在实例化A之后才检测到,B中的方法也会有用(或者更严格地说,我的对象也属于B类)。

虽然

 aInstance.bMethod = types.MethodType(localFunction, aInstance)

原则上工作,必须对任何bMethod重复,并且看起来不必要复杂。它还需要独立(本地)功能,而不是概念上更清晰的B类。是否有更简化的方法?

更新: 我尝试了抽象基类并取得了一些成功,但只能添加一个额外类的方法。

我最终实现的是一个小例程,它添加了给定模块的所有顶级过程:

from types import MethodType
from inspect import ismodule, isfunction, getmembers

# adds all functions found in module as methods to given obj
def classMagic(obj, module):
    assert(ismodule(module))
    for name, fn in getmembers(module, isfunction):
        if not name.startswith("__"):
            setattr(obj, name, MethodType(fn, obj))

在功能上这已经足够了,我也对自动化感到满意,所有功能都已处理完毕,我没有单独的功能定义位置并将其添加为方法,所以维护很容易。唯一剩下的问题由STARTwith行反映,作为必要命名约定的示例,如果所选函数应添加。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望在运行时向您的班级添加mixins。在Python中添加mixins的一种非常常见的方法是通过装饰器(而不是继承),所以我们可以借用这个想法来对对象做一些运行时(而不是类)。

我使用functools.partial来冻结self参数,以模拟将函数绑定到对象的过程(即将函数转换为方法)。

from functools import partial

class SimpleObject():
    pass

def MixinA(obj):
    def funcA1(self):
        print('A1 - propertyA is equal to %s' % self.propertyA)
    def funcA2(self):
        print('A2 - propertyA is equal to %s' % self.propertyA)
    obj.propertyA = 0
    obj.funcA1 = partial(funcA1, self=obj)
    obj.funcA2 = partial(funcA2, self=obj)
    return obj

def MixinB(obj):
    def funcB1(self):
        print('B1')
    obj.funcB1 = partial(funcB1, self=obj)
    return obj

o = SimpleObject()

# need A characteristics?
o = MixinA(o)

# need B characteristics?
o = MixinB(o)

您可以像在问题中一样使用functools.partial,而不是types.MethodType;我认为这是一个更好/更清洁的解决方案。