ホームページ >バックエンド開発 >Python チュートリアル >Python のクラス
Python には関数プログラミングにおいて他の言語にはない利点がありますが、Python はオブジェクト指向言語でもあることを忘れてはなりません。したがって、FP における Python の利点に注目する一方で、Python の OO 特性も理解する必要があります。
Python の OO 機能について議論するには、当然のことながら Python のクラスを理解することが最初に行うべきことです。 Python でのクラスの定義とオブジェクト インスタンスの作成は非常に簡単です。具体的なコードは次のとおりです。
class GrandPa: def __init__(self): print('I\'m GrandPa') class Father(GrandPa): def __init__(self): print('I\'m Father!') class Son(Father): """A simple example class""" i = 12345 def __init__(self): print('这是构造函数,son') def sayHello(self): return 'hello world' if __name__ == '__main__': son = Son() # 类型帮助信息 print('类型帮助信息: ',Son.__doc__) #类型名称 print('类型名称:',Son.__name__) #类型所继承的基类 print('类型所继承的基类:',Son.__bases__) #类型字典 print('类型字典:',Son.__dict__) #类型所在模块 print('类型所在模块:',Son.__module__) #实例类型 print('实例类型:',Son().__class__)
実行ステータス:
Python 3.3.2 (v3.3.2:d047928ae3f6、2013 年 5 月 16 日、00:03:43) [MSC] v. 1600 32 ビット (Intel)] win32 の場合
詳細については、「copyright」、「credits」、または「license()」と入力してください。
>>> ============== == ================ 再スタート ============================== =
>>>>
これはコンストラクターです。son
型のヘルプ情報: 簡単なクラスの例
型名: Son
型によって継承される基本クラス: (
型辞書: {'__module__' : '__main__', 'sayHello':
型が配置されているモジュール: __main__
これがコンストラクターです、息子です
インスタンスタイプ:
>>>>
#Python は多重継承をサポートしています
まず、クラスの定義に括弧があることがわかります。ここで継承が行われます。反射してる。 Java は extends を使用し、C# と C++ はコロン (:) を使用し、Python は括弧を使用します。括弧内に含まれる 2 つの値から、賢明な方であれば、次のことがわかるでしょう: Python は多重継承をサポートしています。
#__init__ は Class のコンストラクターです
2 番目の点、__init__ は Class のコンストラクターであり、2 つは異なります。コンストラクターの形式は、Python の関数オーバーロードのサポートを反映しています。コンストラクターには特別なパラメーター self があり、その意味は Java および C# で一般的なものと同じです。ここで 1 つ強調する必要があるのは、Class で定義されたメソッドは実際には関数ですが、メソッドを定義するときに self パラメーターを含める必要があり、self パラメーターを最初に配置する必要があるということです。
#python メンバー変数
の 3 つの点です。 Python では、クラスのデータ メンバーを明示的に宣言する必要はありません。代わりに、コード内の x と y と同様に、割り当てられた変数がクラスのデータ メンバーになります。データ メンバーを明示的に宣言する必要がないだけでなく、さらに特別なことに、del メソッドを使用してクラス内のデータ メンバーを削除することもできます。初めてこのような機能を見たときは本当に驚きました。結局のところ、OO の最初のポイントはカプセル化ですが、この機能はカプセル化の特性を破壊するのでしょうか?
#pythonメソッドの曖昧さ問題
4番目のポイントは、Pythonは多重継承をサポートしているため、メソッドの曖昧さの問題が発生する可能性があるということです[1]。ただし、Python は深さ優先検索ルールに従うため、メソッドのあいまいさの問題を回避できます。たとえば、上記のコードでは、MyClass が BaseClassA と BaseClassB の両方から継承し、deriveMethod というメソッドを呼び出し、deriveMethod が BaseClassA と BaseClassB の両方で定義されており、シグネチャがまったく同じであると仮定すると、BaseClassA のメソッドは次のようになります。と呼ばれた。 BaseClassA で派生メソッドが定義されていないが、BaseClassA の親クラスでこのメソッドが定義されている場合は、BaseClassA の親クラスの派生メソッドが呼び出されます。つまり、継承メソッドの検索パスは、BaseClass を選択した後、BaseClass の継承構造に沿って先頭まで実行され、次に別の BaseClass に移動します。
今のところはここまでです。Python の OO 機能については、今後の投稿で詳しく説明します。
[1] メソッドの曖昧さ: クラスは同時に 2 つ以上の親クラスから継承し、これらの親クラスにはまったく同じシグネチャを持つメソッドが存在するため、コンパイラーはサブクラスがどの親クラスに継承されるかを判断できません。クラス内のメソッドを継承すると、メソッドの曖昧さが生じます