我是python新手,我想附加一些类,A类方法另一个B类,如下所示
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)
目标是保留B类方法A和实际情况一样A类方法可以通过ClassB.getMyInstanceOfClassA()
方法访问。你知道吗
我这样做的原因是为了避免我的用户编写此代码
h = ClassB()
---the extra logic---
a = h.getMyInstanceOfClassA()
a.methodA(....)
我只是说
h = ClassB()
h.methodA(....)
我在ClassB的新方法A中嵌入了额外的逻辑。你知道吗
methodA在我们的领域是有意义的,我必须保留它的名字和确切的签名
我必须从我们的内部libs导入ClassA和ClassB,我不能让ClassB从ClassA继承。你知道吗
关键是methodA通常不会与所有参数一起调用,传递的参数取决于您希望methodA执行的操作。此h.methodA("p1", "p2", m=True)
失败,并出现一些错误,抱怨向它传递了太多参数。你知道吗
我包装的方法正确吗?你知道吗
我认为您通常只会使用继承,或者只会使该方法成为一个与类无关的函数,其中一个输入就是该类的实例。或者用lambda函数包装它。你知道吗
Python: Bind an Unbound Method?
但是,如果您想获取一个方法并将其绑定到一个类的实例,请使用下面的代码。你知道吗
我不确定是什么原因导致您的错误(我们不能确定,除非您至少显示完整的回溯或至少一个演示代码,再现您的问题)。你知道吗
但是从您粘贴的代码来看,您尝试执行的操作是不可能的。举个简单的例子-
我只是把
b == None
部分放进去,这样代码就不会进行无限递归了,但是您所尝试的将导致无限递归。为什么?你知道吗因为您已将
methodA
更改为指向类级别的新方法,所以即使您为类调用methodA
,它仍将调用新绑定的methodA
,而不是旧方法。你知道吗如果您确实不希望用户直接调用旧的
methodA
,您可以做的一件事是将该方法绑定到另一个名称,可能是_methodA
,然后将新函数绑定到methodA
。示例-相关问题 更多 >
编程相关推荐