为什么Python的内联classmethod与元类定义的方法表现不同

4
一个 classmethod,无论是内联定义还是作为 metaclass 的一部分定义,都可以在类型上调用:
class eggs( type ):
    def f1( cls ):
        print( "eggs" )


class spam( metaclass = eggs ):
    @classmethod
    def f2( cls ):
        print( "spam" )


f = spam()
type(f).f2() #--> spam
type(f).f1() #--> eggs

然而,似乎在元类中定义的 classmethod 不能在实例上调用:
f.f2() #--> spam
f.f1() #--> AttributeError

为什么会这样?

1个回答

6

类是其元类的实例; 您可以在类本身上调用定义在元类中的方法(因为它是元类的实例),但这些方法对类的实例不可用(因为它们不是元类的实例)。

这是有意的; 为类本身提供行为的用例可能与类的实例的特征混淆,而这就是解决这个问题的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接