Pythonの中の_unew_、_init_、_コールバック三つの特殊な方法


同前new_::オブジェクトの作成は、静的方法であり、最初のパラメータはclsである。考えてみれば、selfではないです。対象はまだ作成されていません。どこから来たselfですか?
同前init__:オブジェクトの初期化は、例示的な方法であり、最初のパラメータはselfである。
同前コールバック:対象はコールできます。クラスではなく、対象です。
まず作成があって、初期化があります。先__unew_,それからinit_。
上の話がよく分かりません。例を見てください。
1._に対してnew_

class Bar(object): 
  pass 
 
class Foo(object): 
  def __new__(cls, *args, **kwargs): 
    return Bar() 
 
print Foo() 
 負けはBarの対象と見られます。
同前new_メソッドはクラス定義では書かなければならないものではなく、定義されていないと、デフォルトではobjectを呼び出します。new_オブジェクトを作成します。定義すれば、overrideとなり、オブジェクトを作成することができます。
頭のいい読者は、こう考えるかもしれません。new_customオブジェクトの作成ができますが、ここで細工をしてみます。作成対象は毎回同じに戻ります。それは単なるパターンではないですか?はい、そうです。『飄逸のpython-单例モード乱弾』を見学することができます。
単例モードを定義する場合、カスタムの__unew_父の種類の_u uを積載しましたnew_,だから自分で式を示して父類の_u u uを呼び出します。new_,すなわちobject.new_cls、*args、*kwargs、またはsuper()を使います。そうでなければ、extedの元のインスタンスではなく、元のインスタンスを置き換えることです。
2._に対してinit_
Pythonを使って対象に向けたコードを書いたことがある方はinit_方法はもう慣れました。init_方法は、一般に、クラスのインスタンスを初期化するときに使用される。たとえば:

# -*- coding: utf-8 -*-

class Person(object):
  """Silly Person"""

  def __init__(self, name, age):
    self.name = name
    self.age = age

  def __str__(self):
    return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
  piglei = Person('piglei', 24)
  print piglei

これが_u u u u uですinit_ごく普通の用法です。しかし、_init_実は、クラスを具体化する時に最初に呼び出される方法ではありません。Persion(name,age)という表現を使ってクラスを具体化する場合、最初に呼び出される方法は実は_u u u u u u u uである。new_方法。
3.ガクッに対してコールバック
対象は提供することによりコールバックslef、[、**args[、****kwargs]]方法は、関数の動作をシミュレートすることができます。オブジェクトxがこの方法を提供すれば、関数のようにそれを使用することができます。つまり、x(arg 1,arg 2...)は、x.u.uコールバックself,arg 1,arg 2)アナログ関数のオブジェクトは、アンチ関数またはプロキシを作成するために使用できます。

class Foo(object): 
  def __call__(self): 
    pass 
 
f = Foo()# Foo call 
f()#  f call 
まとめて、Pythonでは、類の行為はこうです。new_、_init_、_コールバックなどの方法は書かなくても、デフォルトで呼び出します。自分で定義したら、overrideです。customができます。overrideになった以上、通常は明示的に補償を呼びかけてextedの目的を達成します。
これもなぜですか?init_(u)self、*args、*kwargs)では、対象がどうやって初期化されないのですか?ここにinit_下線を少なく書きました。init_必ず書かなければならないのではないので、ここでは間違いなく、新しい方法として報告します。init_