这是关于多重继承。父类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行反映,作为必要命名约定的示例,如果所选函数应不添加。
答案 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
;我认为这是一个更好/更清洁的解决方案。