Pythonにおけるclassの実行順序例の詳細


前言
ここでは、Pythonの実装手順に関する内容を紹介します。以下の話は多くありません。詳しく紹介してみましょう。
Pythonではクラスの実装時にどのような順序がありますか?
一般的には一つのクラスにはAというクラスを定義するような変数と方法があります。

class A():
 bar = "my lover love me"
 
 def __init__(self, name):
  print('A class' ,self.__class__, name)
私たちはこのクラスの中で一つのクラス変数barと一つの構造方法を定義しました。init_,では、私たちはA()を実写化する時に何が起きましたか?役人は焦らないでください。ゆっくり話してください。
  • まず、pythonは内蔵のtype類を呼び出して、聞き間違いがなくて、つまり私達がふだん使ってタイプのそのtypeを参照することに用いて、そしてtypeは内蔵の元種類のmate Classを呼び出して、mate Classは更に_u u_u uを呼び出します。new_この方法はクラスを例示し、このとき第1のステップ
  • を完了した。
  • その後、この例は自分のクラス変数を初期化します。つまり自分を最初から最後まで見回します。
  • の後、構造方法に進み、自分のインスタンス変数を初期化する。
  • 注意:pythonではクラス変数とインスタンス変数が異なります。
    クラス変数:実装しなくてもアクセスできます。
    インスタンス変数:動的に作成されます。前には存在しなかったので、実装後に訪問することができます。
    例えば、以下の例:アクセスクラス変数を実装しない
    
    class A():
     a = 2
    print(A.a)
    出力:
    >>2
    これだけ言ってコードを入れます。クラス引継ぎを見てください。
    
    class A():
     def __init__(self, name):
      print('A class' ,self.__class__, name)
      
    class B(A):
     def __init__(self, name):
      self._name = name
      A.__init__(self, name)
      print('B class', self.__class__, name)
     print('this is B class')
      
    class C(B):
     def __init__(self, name):
      B.__init__(self, name)
      print('C class')
      
    if __name__ == '__main__':
    
    c = C('lee')
    出力は以下の通りです
    this is Bクラス
    Aクラス<クラス>_メーン.C'>lee
    Bクラス〈クラス〉_メーン.C'>lee
    Cクラス
    自らの説を具現して,一難を説き明かす。
  • はまずclass C()を実例化し、頭から最後までスキャンし、C()の構造に入り、親C()の構造方法B._init_
  • はクラスB()に入り、最初から最後まで掃いて、print('this is B class')の文を実行してからB()の構造に入り、親B()の構造方法A.init_
  • はクラスA()に入り、頭から最後まで掃除して、A()の構造方法A.uinit_。そしてA._u uinit_実行が完了したらスタックをイジェクトし、クラスA()の実行が完了したらスタックをイジェクトする。
  • はクラスBに戻り、前回実行されなかったところからprint('B class', self.__class__, name)が実行される。そしてB._u uinit_実行が完了し、スタックをイジェクトし、クラスB()の実行が完了し、スタックをイジェクトする。
  • はクラスCに戻り、前回実行されていなかったところからprint('C class')が実行される。そしてC.__uinit_実行が完了し、スタックをイジェクトし、クラスC()の実行が完了し、スタックをイジェクトする。プログラムの実行が完了しました。
  • はクラスC()を実例化するため、上のselfはすべてクラスC()の実例であり、クラスA()のまたはクラスB()ではない。だからself.u_クラス一色の表示は<class '__main__.C'>であって、<class '__main__.A'>または<class '__main__.B'>ではない。
  • 適当にタイプのキーワードを使って動的にタイプを作成する知識点を補充して、黒板を叩いて、、、CET 3.5の英語のレベルで一部の公式文書のtypeに対する説明を翻訳します。
    3つのパラメータを使用して、新しいタイプのオブジェクトを返します。これは実はクラスの語句のダイナミックな形式です。名前文字列は類名で、__uになります。name_属性;基元グループは基質を並べて、「__u」になります。bases属性;また、dict辞書はクラス主体が定義する名前空間を含んでおり、標準辞書にコピーされて、__u udict_.を選択します。
    どうですか?言いにくいですか?大文字の愚かさですか?so、上のコード、下の2つの書き方の出力は同じです。出力です。
    
    class X():
     a = 1
     def __name__(self):
     return '  name  ' 
    x =X()
    print(x.__name__(), x.a)
    
    X = type('  name  ', (object,), dict(a = 1))
    x = X()
    print(X.__name__, x.a)
    typeダイナミック作成の実例化では、最初のパラメータは書き換えたクラスの___uに相当します。name_方法。X種ですが、_唵name_属性はXではないです。えっと、人間の書き方に反対です。
    幸い、私たちは普通は変態ではありません。普通はこの二つを同じ名前に定義します。X = type('X', (object,), dict(a = 1))締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考となる学習価値を持っています。質問があれば、メッセージを書いて交流してください。ありがとうございます。