メタクラスhereについて読みながら、この区別はメタクラスに特有のものであり、私はそれがないと思われる場合、私は知らないが、私は、次のコードに出くわした:super().__init__()
呼び出しは最初のを省略することを__new__と__init__は、スーパークラスにパントするときに、動作が異なるように見えるのはなぜですか?
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()
によって返されるどんなクラスのメソッドを呼び出しているとして、それは、暗黙のうちに渡された推測しています。彼らは通常、メタクラスの通常のクラスではなく、CLS/MCLにself
を伴うが、それは、私は通常、このような呼び出しが構築さ見てきた方法です。
super().__new__()
コールでは、明示的にはmcl
が渡されます。なぜか分からない。署名は私と同じように見えます。
私は混乱しています。 super()
は、それぞれ異なる場合がありますか?ここで何が起きているのですか?また、他の魔法を無効にするときにこれに噛まれることが予想されるでしょうか?
[編集:誰かが、異なる機能を説明しているthis questionの複製であると提案しました。同じ差があっ例のいくつかに展示されている間、それが存在するか、それが__new__
に固有のかどうか、なぜ、私が述べて何も見えません。]
'__new__'は静的メソッドです。 '__init__'はインスタンスメソッドです。 – spectras
[Pythonの\\ \ new \ _ \ _と\ _ \ _ init \ _ \ _?]の可能な複製(http://stackoverflow.com/questions/674304/pythons-use-of-new-and- init) – spectras
「__new__'の公式文書の最初の文章について:「[__new __()は静的メソッドです(特別なケースで宣言する必要はありません)](https://docs.python.org/3/reference/datamodel。html#object .__ new__) " – spectras