【发布时间】:2016-11-06 16:37:43
【问题描述】:
我在阅读元类here 时遇到了以下代码,尽管我不知道这种区别是否特定于元类,我怀疑它不是:
class MetaBase(type):
def __new__(mcl, name, bases, nmspc):
print('MetaBase.__new__\n')
return super(MetaBase, mcl).__new__(mcl, name, bases, nmspc)
def __init__(cls, name, bases, nmspc):
print('MetaBase.__init__\n')
super(MetaBase, cls).__init__(name, bases, nmspc)
请注意,super().__init__() 调用省略了第一个参数。我猜它是隐式传递的,因为它在 super() 返回的任何类上调用一个方法。这就是我经常看到构建此类调用的方式,尽管它们通常涉及普通类上的self,而不是元类上的 cls/mcl。
super().__new__() 调用显式传递了mcl。我不明白为什么。签名在我看来是一样的。
我很困惑。 super() 是否在每种情况下都返回不同的东西,也许?这里发生了什么,当我覆盖其他魔法方法时,我应该期望被这个咬吗?
[编辑:有人建议这是 this question 的副本,它描述了它们的不同功能。虽然在其中的一些示例中展示了相同的差异,但我没有看到任何说明它存在的原因或它是否是 __new__ 独有的。]
【问题讨论】:
-
__new__是一个静态方法。__init__是一个实例方法。 -
关于编辑,
__new__的官方文档第一句:“__new__() is a static method (special-cased so you need not declare it as such)” -
好吧,这很有道理。在答案中解释一下,我会接受。不过,我还想知道是否还有其他神奇的静态方法需要担心——据我所知没有,但显然我不能相信没有标记为静态的东西实际上是非-静态的。
标签: python python-3.x