从另一个类中借用实例方法的实现很简单,但是如何用类方法来实现呢?
class A:
def im(self):
print(self.__class__.__name__)
@classmethod
def cm(cls):
print(cls.__name__)
class B:
im = A.im
cm = A.cm # line X
classmethod(cm)
B().im() # B - OK
B.cm() # A - not what I want
我还尝试将 X 行更改为 cm = A.cm.__func__,这导致 TypeError: cm() missing 1 required positional argument: 'cls'
请您参考如下方法:
当您访问 A.cm 时,您调用 classmethod 对象作为 descriptor ,这意味着它已经绑定(bind)到 A 类。再次打开它:
class B:
cm = classmethod(A.cm.__func__)
.__func__ 属性使您可以访问原始函数,因此您可以使用新的 classmethod 调用重新包装它。
或者,使用 A.__dict__ 映射来获取实际的类方法本身,绕过描述符调用:
class B:
cm = A.__dict__['cm']
