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

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

classmethod,无论是内联定义还是作为 元类 的一部分,都可以始终在类型上调用:

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 的内联类方法与元类定义的方法行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57626265/

相关文章:

python-3.x - 为什么我从列表开头删除偶数的代码不起作用?

python - 如何使用装饰器修改 *args 的类型?

grails - Grails-全局通用的制作方法和元类编程

python - python中的时间分析

Python UPS XML 跟踪

python - 使用 Python 在 Visual Studio Code 中调试不起作用

mysql - 将 JSON 解析为 MYSQL Python 3

python - 定义元类时是否有任何理由选择 __new__ 而不是 __init__ ?

python - 我可以在第一个断言失败后测试测试的所有断言吗?

python - Django 需要很长时间才能加载