从另一个类借用类方法(Python 3)

从另一个类借用类方法(Python 3),python,class-method,Python,Class Method,从另一个类借用实例方法的实现很简单,但是如何使用类方法呢 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 wa

从另一个类借用实例方法的实现很简单,但是如何使用类方法呢

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.\uu func\uu
,这导致
TypeError:cm()缺少1个必需的位置参数:“cls”
您需要:

class B:
  im = A.im
  cm = classmethod(A.cm.__func__)

当您访问
A.cm
时,生成的classmethod已经“知道”它属于A。如果您想为其他类重写它,您需要使用
\uuuuuu func\uuuu
提取底层函数,然后使用
classmethod
重写它

另外,在您的示例中,
classmethod(cm)
行没有任何作用,因为您没有将结果分配给任何对象。

您需要:

class B:
  im = A.im
  cm = classmethod(A.cm.__func__)

当您访问
A.cm
时,生成的classmethod已经“知道”它属于A。如果您想为其他类重写它,您需要使用
\uuuuuu func\uuuu
提取底层函数,然后使用
classmethod
重写它


另外,在您的示例中,
classmethod(cm)
行没有任何作用,因为您没有将结果分配给任何对象。

当您访问
A.cm
时,您将
classmethod
对象作为对象调用,这意味着它已经绑定到
A
类。重新打开它:

class B:
    cm = classmethod(A.cm.__func__)
\uuuu func\uuuu
属性允许您访问原始函数,因此您可以使用新的
classmethod
调用重新包装它

或者,使用
A.。\uuuu dict\uuu
映射来获取实际的类方法本身,绕过描述符调用:

class B:
    cm = A.__dict__['cm']

当您访问
A.cm
时,您将
classmethod
对象作为对象调用,这意味着它已经绑定到
A
类。重新打开它:

class B:
    cm = classmethod(A.cm.__func__)
\uuuu func\uuuu
属性允许您访问原始函数,因此您可以使用新的
classmethod
调用重新包装它

或者,使用
A.。\uuuu dict\uuu
映射来获取实际的类方法本身,绕过描述符调用:

class B:
    cm = A.__dict__['cm']

啊!!因此,我正确地改变了X行的方式-只是我还应该将下面的行更改为
cm=classmethod(cm)
@Heny'Pi'James:是的,这将产生与我的解决方案相同的效果。啊!因此,我正确地改变了X行的方式-只是我还应该将下面的行更改为
cm=classmethod(cm)
@Heny'Pi'James:是的,这将产生与我的解决方案相同的效果。这个替代方案看起来很有趣,但也有点脏。这是防止描述符协议生效的唯一方法;它主要是为了说明。这个替代方案看起来很有趣,但也有点脏。这是防止描述符协议生效的唯一方法;它主要是为了说明。