ホームページ >バックエンド開発 >Python チュートリアル >Python オブジェクト指向プログラミング (2)
1.継承と派生
Python のすべてはオブジェクトであると上で述べました。オブジェクトから共通の特性やスキルを抽出し、クラスという概念を獲得しました。クラス間には共通の特性もあり、共通の特性やスキルを持つクラス (親クラスと呼ばれます) から共通のスキルや特性を抽出することもできます。
例えば、先生と生徒には名前、年齢、誕生日、性別などがあり、全員が歩き、話し、食事をします。 。 。教師と生徒の「人間」クラスを親クラスと呼びます。教師と生徒は「人間」クラスのサブクラスであり、親クラスの特性とメソッドを持ちます。
継承は「である」関係です。もちろん、その目的はコードの再利用を減らすことです。
継承の基本的な形式は次のとおりです:
Python では多重継承がサポートされており、サブクラスは複数の親クラスを継承できます
タプルを返す __bases__ メソッドを通じて、継承されたすべての親クラスを表示できます。
People 親クラスでは、オブジェクト クラスもデフォルトで継承されていることがわかります。これが、新しいスタイルのクラスとクラシック クラスの違いです。
オブジェクト クラスとそのサブクラスを継承するすべてのクラスは、新しいスタイル クラスと呼ばれます。オブジェクト クラスのクラスは継承を持たず、クラシック クラスと呼ばれます。
Python 3 ではデフォルトは新しいスタイルのクラスですが、Python 2.X ではデフォルトはクラシック クラスです
継承によってコードはどのように削減できるのでしょうか?例を参照してください
上記の例からわかるように、Teacher クラスは親クラス People クラスを継承しますが、Teacher には独自の一意の属性レベルがあり、サブクラスも独自の一意のメソッドを定義でき、親クラスと同じ名前を持つこともできます。ただし、実行はサブクラスの定義に基づいて行われます。
これを導出といいます
2. 組み合わせ
継承は「何であるか」の問題を解決します。次に、すべてに何かがあるという別のシナリオがあります。たとえば、教師にも誕生日があり、誕生日には年、月、日などの属性があります。各クラスがコードを記述すると、そのコードが繰り返されます。ただし、生徒と教師が誕生日クラスを継承することはできません。これは の組み合わせが使用される場合です。 組み合わせは、「持っているもの」の問題を解決することです。例を参照してください
何?パラメーターが多すぎますか? *学んで、ただ満足してください
3. 抽象クラスとインターフェイス
継承には 2 つの用途があります: 1. コードの再利用、サブクラスは親クラスのメソッドを継承します
2. ある親クラスと互換性のあるサブクラスを宣言し、インターフェースクラスInterfaceを定義する インターフェースクラスは、インターフェースの機能を継承するものではなく、いくつかのインターフェース名(つまり関数名)を定義します。クラスを作成し、関数
を実装します。Python にはインターフェースのキーワードがないことに注意してください。
例えば、Python ではすべてがファイルであるため、プログラムもファイル、ハードウェアもファイルです。テキストドキュメントもファイルです。それは、プログラムとテキストドキュメントがすべて読み書きできることを意味します
这么做的意义就是:我们不需要知道子类有什么具体的方法,既然他们继承了文件类,那他们就是文件,那他们就有读和写这两个功能
父类限制了子类子类必须有read和write这两个方法,而且名字也必须一样(当然现在只是我们主观上的限制,一会我们说完抽象类,就可以从代码级别上限制了),这样就实现了统一,模拟了接口的概念,这就是归一化设计。在归一化设计中,只要是基于一个接口设计的类,那么所有的这些类实例化出来的对象,在用法上是一样的
我们再来说一下抽象类:
Python中的抽象类需要导入一个模块来实现。抽象类只能被继承,不能被实现
抽象类的写法:
<span style="color: #0000ff">import</span><span style="color: #000000"> abc </span><span style="color: #0000ff">class</span> File(metaclass=<span style="color: #000000">abc.ABCMeta): @abc.abstractmethod </span><span style="color: #0000ff">def</span><span style="color: #000000"> read(self): </span><span style="color: #0000ff">pass</span><span style="color: #000000"> @abc.abstractmethod </span><span style="color: #0000ff">def</span><span style="color: #000000"> write(self): </span><span style="color: #0000ff">pass</span> <span style="color: #008000">#</span><span style="color: #008000">父类使用了抽象类,那子类就必须继承父类的方法,而且名字也必须一样</span><span style="color: #008000"> #</span><span style="color: #008000">这样就实现了代码级别的限制</span> <span style="color: #0000ff">class</span><span style="color: #000000"> Txt(File): </span><span style="color: #0000ff">def</span><span style="color: #000000"> read(self): </span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">文本文档的读取方式</span><span style="color: #800000">'</span><span style="color: #000000">) </span><span style="color: #0000ff">def</span><span style="color: #000000"> write(self): </span><span style="color: #0000ff">print</span>(<span style="color: #800000">'</span><span style="color: #800000">文本文档的写入方式</span><span style="color: #800000">'</span>)
4.继承的实现原理
1)继承顺序:
python支持多继承,当一个类继承多个父类时,继承顺序是怎样的呢?这个顺序在新式类和经典类中是不一样的。
在新式类中,继承顺序是广度优先,在经典类中是深度优先,举个栗子:
图不重要,看内容
在这个图中,H是子类,H继承E,F,G,E,F,G,又分别继承B,C,D,B,C,D,同时继承A
在新式类中的顺序是:H E B F C G D A
在经典类中的顺序是:H E B A F C G D
2)继承原理:
当我们定义一个类后,Python就会根据上面的继承规律解析出一个继承顺序的列表(MRO列表),可以通过mro()查看,但是这个方法只有在新式类中才有,经典类没有
以上がPython オブジェクト指向プログラミング (2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。