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

Why Python's inline classmethods behave differently to metaclass defined methods

A 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

但是,似乎无法在实例上调用元class中定义的classmethod:

f.f2() #--> spam
f.f1() #--> AttributeError

这是为什么?

类 是其 metaclass 的实例;您可以在 class 本身上调用 metaclass 定义的方法(因为它是 metaclass 的一个实例),但它们对 class 的实例不可用(因为它们不是 metaclass 的实例)。

这是故意的;有为 class 本身提供行为的用例,不能与 class 实例的功能混淆,就是这样。