2011-08-01 10 views
7

データベースに属性が保存されているオブジェクトを作成しようとしています。したがって、私は__init__に電話したくありません。この欲望はGuido's intended use for __new__とインラインであるように見えます。 __init__がなぜ呼び出されないのか分かりません。__new__が引数なしで呼び出された場合、__init__が呼び出されないのはなぜですか?

たとえば、次のスニペットを実行すると、__init__を呼び出さずにUserクラスのインスタンスが返されます。

class User(object): 
    def __init__(self, arg1, arg2): 
     raise Exception 

user = User.__new__(User) 

print user 
<project.models.User object at 0x9e2dfac> 

これは私が望む動作です。しかし、私の質問は、なぜ私は理解していないということですか?

python docs__init__は、__new__が「clsのインスタンスを返す」ときに呼び出されることになっています。

__init__は、__new__がクラスインスタンスを返しても、なぜ呼び出されないのですか?

+1

実際に動作するコードを投稿してください。あなたは 'def __init__'を意味しましたか? –

+0

私はこの同じことに出くわしました。しかし、ドキュメントでは、「__new __()がclsのインスタンスを返すと、新しいインスタンスの__init __()メソッドが__init __(self [、...])」のように呼び出されます。それはドキュメントのバグですか、私はそれを誤解していますか? – UsAaR33

+1

@ UsAaR33あなたはそれを間違って解釈しています。 'SomeClass(args)'を呼び出すと(通常は) 'instance = SomeClass .__ new __(SomeClass、args)'が実行され、 'インスタンス.'が' SomeClass'のインスタンスであれば 'instance .__ init __(args)'が呼び出されます。ドキュメントは、 '__new__'を直接呼び出すことは、それを最初に定義する必要があるよりも稀ですから、そのシーケンスの文脈では' __new__'について話しています。 – Ben

答えて

10

コンストラクタUser()アロケータUser.__new__())と順番に初期化子User.__init__())を呼び出すための責任があります。コンストラクタは決して呼び出されないので、イニシャライザは決して呼び出されません。

10

__new__を直接呼び出すことで、通常の構築メカニズムをバイパスしているためです。 __init__ -after- 012-ロジックはtype.__call__(CPythonではtypeobject.ctype_call関数)にあるので、User(...)を実行したときにのみ発生します。