将类方法附加到另一个现有类

时间:2015-08-23 04:05:38

标签: python python-2.7

这里是python的新手,我希望将一些类ClassA.methodA附加到另一个ClassB,如下所示

def methodA(self, x=None, y=None, z='somevalue', l=None, m=False, **kwds):

  ... Some logic here....

  a = self.getMyInstanceOfClassA() //a is of type ClassA, not ClassB
  a.methodA(x,y,z,l,m,**kwds) 

ClassB.methodA = methodA

...

h = ClassB()
h.methodA("p1", "p2", m=True)

目标是保持ClassB.methodA的签名与它应该在ClassB.getMyInstanceOfClassA()方法上可访问的实际ClassA.methodA上相同。

我这样做的原因是为了避免我的用户编写此代码

h = ClassB()
---the extra logic---
a = h.getMyInstanceOfClassA()
a.methodA(....)

反而只是说

h = ClassB()
h.methodA(....)

我将额外的逻辑嵌入到ClassB的新方法A中。

methodA在我们的域中是有意义的,我必须保留其名称和确切的签名

我必须从内部库中导入ClassA和ClassB,并且我不能从ClassA继承ClassB。

关键是methodA通常不会被调用所有参数,传递的参数取决于你想要methodA做什么。这个h.methodA("p1", "p2", m=True)失败了一些错误,抱怨传递了太多的参数。

我是否正确包装了methodA?

1 个答案:

答案 0 :(得分:0)

我认为你通常只使用继承或只是使该方法成为与该类无关的函数,其中一个输入是该类的实例。或者你只需​​将它包装在lambda函数中。

Python: Bind an Unbound Method?

但是,如果你想要一个方法并将它绑定到一个类的实例,请使用类似下面的代码。

inst = MyClass()
inst.methodA = methodA.__get__(inst, MyClass)