为什么 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 实例的功能混淆,就是这样。
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 实例的功能混淆,就是这样。