2016-09-23 8 views
1

__init__が呼び出される前にクラスのインスタンスを作成しようとすると、__new__メソッドが呼び出されることがわかりました。インポートコールは__new__静的メソッドですか?

a.py:

import abc 
class A(abc.ABCMeta): 
     def __new__(cls, name, bases, namespace): 
      print("ttt:", cls, name, bases, namespace) 
      retval = abc.ABCMeta.__new__(cls, name, bases, namespace) 
      return retval 


    class B(object): 
     __metaclass__ = A 

しかし、私はそれを見つけるために起こった、インスタンスを作成するモジュールwithouをインポートも__new__

は私がこれを持っていると呼びますb.py

import a 

class C(B): 
    def a(): 
     pass 

python b.pyを実行すると、tttが2つ表示されます。__new__で印刷します。だから、 、正確に呼ば新しいが、この場合には、私はあなたがクラスを定義するメタクラスを使用すると、メタクラスがこれ(暗黙のうちに「と呼ばれる」され

+0

サイドノート: '__new__'は静的メソッドではありません。これは暗黙のうちにクラスメソッドのように動作するコンストラクタです(クラスのインスタンスではなく、最初の引数としてクラスを受け取ります)が、静的ではありません。静的とは、それが単にクラスによって名前空間になっていて、他の方法でそれに関連付けられていなかったことを意味します。 – ShadowRanger

答えて

2

を定義した三つのクラスのインスタンスを作成したことがないんここではメタクラスが実際のクラスなので__new__を呼び出します)。Invoking the metaclassを参照してください。なぜここに3つのプリントがあるのか​​はわかりません(Aをメタクラスとして直接的または間接的に継承を通して使用する2つのクラスしかありませんが)、それはprintの2つを説明しています。

+0

間違えて申し訳ありませんが、私は2つのプリントを持っています.1つはBのためのもので、Cの場合は – demonguy

+0

@demonguy:Cの定義を正確に伝えていませんでした( 'class(C):'は無効な構文です)。それがメタクラスとして 'A'を使うことを含んでいれば、それはそれを説明するでしょう。 – ShadowRanger

+0

はい、そうです、それは 'クラスC(B):'です。 typo.lolに申し訳ありません – demonguy

関連する問題