从另一个类借用类方法(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:是的,这将产生与我的解决方案相同的效果。这个替代方案看起来很有趣,但也有点脏。这是防止描述符协议生效的唯一方法;它主要是为了说明。这个替代方案看起来很有趣,但也有点脏。这是防止描述符协议生效的唯一方法;它主要是为了说明。