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

c z*_*c z 4 python metaclass class-method python-3.x

可以直接在类型上调用A classmethod,无论是内联定义还是in的一部分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
Run Code Online (Sandbox Code Playgroud)

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

f.f2() #--> spam
f.f1() #--> AttributeError
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

Sha*_*ger 5

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

这是故意的;有一些为类本身提供行为的用例,不能与类实例的功能混淆,仅此而已。