Pythonを深く理解する(五)

4374 ワード

クラス#クラス#
  • クラス名通常最初のアルファベット大文字
  • PythonにはC++のような構造関数や解析関数はなく、Pythonには構造関数に似たものが存在し、__init__の方法がある.
  • Pythonのクラスのベースクラスは、Javaに特別なextendsキーワードがあるわけではありません.
  • Pythonは多重継承をサポートし、カッコで
  • をカンマで区切る__init__とself
  • __init__は、クラスのインスタンスが作成された直後に呼び出され、クラスの構造関数とは異なる.なぜなら、__init__を呼び出す前にオブジェクトが構築されているため、クラスの新しいインスタンスに対する有効な参照selfがあります.
  • 各クラスメソッドの最初のパラメータは、selfと呼ばれるクラスの現在のインスタンスへの参照(__init__を含む)である.
  • selfはC++、Javaのthisの役を演じています.しかしselfは保留字ではなく、命名習慣です.
  • サブクラスから親クラスのメソッドを呼び出す場合はselfパラメータを含む必要があります.ただし、クラスの外部からクラスメソッドを呼び出す場合はselfパラメータに値を指定する必要はありません.
  • __init__メソッドは、実際にはオプションですが、定義されると、親を呼び出す__init__メソッドを表示することを覚えておく必要があります(あれば).

  • クラスのインスタンス化とゴミ回収
  • __class__は、各クラスのインスタンスにオブジェクトのクラスであるこのような組み込み属性を有する.
  • クラスのすべてのインスタンスは、同じdoc stringを共有します.
  • ごみ収集方式、参照カウント
  • さらに
  • -
    関数のリロードとメソッドのオーバーライド
  • Javaは、パラメータリストによるリロードをサポートします.つまり、クラスには同名の複数のメソッドがありますが、これらのメソッドは、パラメータの個数が異なるか、パラメータのタイプが異なるかです.
  • 他の言語(PL/SQLなど)は、パラメータ名によるリロードをサポートします.つまり、クラスには同じタイプ、同じ数のパラメータがありますが、パラメータ名は異なります.
  • Pythonでは、関数のリロードはサポートされていません.__init__メソッドは、パラメータにかかわらず、クラスごとに__init__メソッドしかありません.さらに、サブクラスの__init__メソッドは、親の__init__メソッドを常に上書きし、サブクラスは異なるパラメータリストで定義することができる.

  • Pythonの著者Guido氏は、「サブクラスは親のメソッドを上書きすることができる.メソッドには特別な優先度設定がないため、親のメソッドの1つが同類の別のメソッドを呼び出す場合、実際にはサブクラスで親の同名メソッドを上書きするメソッドが呼び出される可能性がある」と説明している.
  • copyモジュールのcopy関数は、任意のpythonオブジェクトをコピーできます.

  • プライベートクラス
    専用メソッド
  • 形式:__something__
  • 特別な場合、または特別な構文を使用する場合、コードで直接呼び出すのではなく、Pythonによって呼び出されます.
  • 例えば
  • In: li = {1:1}
    In: li[2] = 2
    In: li
    Out: {1: 1, 2: 2}
    In: li.__setitem__(2,3)
    In: li
    Out:{1: 1, 2: 2, 3: 3}
    In: li[1]
    Out: 1
    In: li.__getitem__(2)
    Out: 2
  • 正しい構文で値と戻り値を設定すると、Pythonは__setitem__メソッドと__getitem__メソッドを呼び出します.
  • __repr__は、repr(instance)が呼び出されると呼び出される専用の方法であり、repr関数はオブジェクトの文字列表現を返す内蔵関数である.
  • __cmp__は、クラスインスタンスを比較するための専用の方法である.==を使用してクラスを比較することができます.Pythonはこの専用メソッド
  • を呼び出します.
  • ——len__がlen(instance)を再呼び出したときに呼び出されます.lenは、長さが利用されていると考えられる任意のオブジェクトに使用できる組み込み関数です.

  • 判断対象の等化
  • Javaでは、str1 == str2を使用して、2つの文字列変数が同じ物理メモリ位置を指すかどうかを決定できます.これを対象同一性と呼ぶ.
  • Pythonでは、str1 is str2を使用して、同じ物理メモリ位置を指すか否かを判断する.
  • Javaでは、str1.equals(str2)により2つの文字列値が等しいか否かを判断する
  • .
  • Pythonでは、str1 == str2を用いて値の等化
  • を判断する.
    専用メソッドの意味
  • 専用メソッドは、__setitem__メソッドを定義する限り、任意のクラスが辞書のようにキー値ペアを保存できることを意味する.__getitem__メソッドを定義する限り、任意のクラスはシーケンスのように表現できます.__cmp__メソッドを定義するクラスは、==で比較することができる.__len__メソッドを定義したクラスは、類似の長さのものを持つことができます.
  • __call__メソッドでは、クラスが関数のように表現され、クラスインスタンスを直接呼び出すことができます.

  • クラス属性
  • Javaの静的変数(staticキーワードあり)はPythonのクラス属性に等しい.
  • Pythonでは,クラス属性定義はクラス定義後,データ属性定義は__init__メソッドである.
  • クラス属性は、クラスレベルの定数として使用できますが、実際の定数ではありません.変更できます.

  • Pythonには定数はありませんが、努力しようとすれば何でも変えられます.この点はPythonの核心原則の一つを満たしている:悪い行為は取り締まるのではなく克服されるべきだ.
    プライベート関数
  • Pythonのプライベート属性とプライベートクラスメソッドは、プライベートである2つの下線で開始されます(ただし、終了ではありません).他のすべては公有です.
  • Pythonの独自の方法と内蔵属性(例えば__doc____setitem__)は、いずれも標準的な命名習慣を遵守し、開始と終了には2つの下線がある.独自のメソッドは通常、直接呼び出されるのではなく、クラスで正しい構文を使用してPythonを呼び出す.
  • PythonはC++とは異なり、protectの概念があり、Pythonのクラスメソッドはprivateの(自分のクラスでしか使用できない)、publicの(どこでも使用できる)、protect(つまり自分のクラスとサブクラスで使用される)はありません.