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

2024-04-25 01:45:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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)失败,并出现一些错误,抱怨向它传递了太多参数。你知道吗

我包装的方法正确吗?你知道吗


Tags: 方法selfnonetrue参数defp2logic
2条回答

我认为您通常只会使用继承,或者只会使该方法成为一个与类无关的函数,其中一个输入就是该类的实例。或者用lambda函数包装它。你知道吗

Python: Bind an Unbound Method?

但是,如果您想获取一个方法并将其绑定到一个类的实例,请使用下面的代码。你知道吗

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

我不确定是什么原因导致您的错误(我们不能确定,除非您至少显示完整的回溯或至少一个演示代码,再现您的问题)。你知道吗

但是从您粘贴的代码来看,您尝试执行的操作是不可能的。举个简单的例子-

>>> class A:
...     def methodA(self, a):
...             print(a)
...             print("In A")
...
>>> def methodA(self, a, b=None):
...     print("In Main")
...     if b == None:
...             return
...     else:
...             h = type(self)
...             h.methodA(self, a)
...
>>> A.methodA = methodA
>>> h = A()
>>> h.methodA(1,2)
In Main
In Main

我只是把b == None部分放进去,这样代码就不会进行无限递归了,但是您所尝试的将导致无限递归。为什么?你知道吗

因为您已将methodA更改为指向类级别的新方法,所以即使您为类调用methodA,它仍将调用新绑定的methodA,而不是旧方法。你知道吗

如果您确实不希望用户直接调用旧的methodA,您可以做的一件事是将该方法绑定到另一个名称,可能是_methodA,然后将新函数绑定到methodA。示例-

>>> class A:
...     def _methodA(self, a):
...              print(a)
...              print("In A")
...
>>> def methodA(self, a, b=None):
...     print("In Main")
...     if b == None:
...             return
...     else:
...             h = type(self)
...             h._methodA(self, a)
...
>>> A.methodA = methodA
>>> h = A()
>>> h.methodA(1,2)
In Main
1
In A

相关问题 更多 >