【问题标题】:Why Python's inline classmethods behave differently to metaclass defined methods为什么 Python 的内联类方法的行为与元类定义的方法不同
【发布时间】:2019-12-28 18:39:19
【问题描述】:

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

这是为什么?

【问题讨论】:

    标签: python python-3.x metaclass class-method


    【解决方案1】:

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

    这是故意的;有一些用例可以为类本身提供不能与类实例的特性混淆的行为,就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 2018-05-07
      • 2022-07-20
      • 1970-01-01
      • 2021-01-01
      相关资源
      最近更新 更多