オブジェクト指向のPython(3)_三つの特徴

継承されたオブジェクトの

公式声明は:
別のカテゴリーB「から継承された」カテゴリAは、Aを入れた場合は、「サブカテゴリーB」と呼ばれ、また、呼び出すことができるB「は、カテゴリAの父」と呼ばれる「AのBはスーパーですクラス。 " 継承は、再び同じコードを記述することなく、様々なサブカテゴリのような性質や親クラスのメソッドを持つことができます。玲子のカテゴリは親クラスを継承しながら、あなたはとても親カテゴリ別の関数を取得するには、特定の属性を再定義し、いくつかのメソッド、プロパティと覆われている元の親カテゴリのメソッドをオーバーライドすることができます。また、サブカテゴリ、追加の新しいプロパティとメソッドのために、それはまた、一般的に行われています。一般的な静的なオブジェクト指向プログラミング言語、実施期間中に展開することはできません、サブカテゴリーの行動にコンパイルすることを決定してきた意味、静的に継承されました。
言って:
あなたは一人っ子ある場合には、ある、彼の父、家族の財産の法的後継者を継承していない、とあなたは非常に従順です、何も、あなたはすべての家、あなたの両親を継承し、その財産のすべてがあなたによって使用されます

継承の利点:

1クラスの結合の増加(適切でない結合は、微細であるべきです)。
図2に示すように、繰り返しコードを減らします。
図3は、合理化、コードはより標準になります。

継承された分類。

継承:単一継承、多重継承に分けることができます。
それはpythonで種(継承された必須)クラスを追加する必要があります
python2xバージョンでは2つのクラスがあります。
  ⼀古典的なストレートと呼ばれるクラスのpython2.2前⼀使用クラシッククラシックは、基本クラスがあります...根は何も書かない場合。
  ⼀のpython2.2後の新しいクラスの出現と呼ばれる新しいクラスを。新しいクラスを備え、基本クラスであるルートクラスのオブジェクトです。
python3xバージョンは唯一のクラスです。
そのオブジェクトを継承しないクラスがデフォルトで継承する場合..新しいクラスののpython3操作の使用は、基本クラスであります

実行順序

オブジェクトは、オブジェクトクラスから見__init__メソッドではなく、親クラスから見たクラス、ではなく、親クラス、インスタンス化されるときに実行する必要があります。
実行方法は、まず、親クラスで独自のクラスを実行する方法はありません、自分のクラスを食べる必要があります。
あなたがこの方法およびサブクラス夜、FUNCの親クラスのメソッドを実行する場合は、サブクラスのメソッドで書く:
親.func(オブジェクト、他のパラメータ)

多重継承古典的なクラス

しかし、MROクラシック
ワイドの-最初のトラバーサル
ゼロからのスタート。左から右へ。⼀道路はその後戻って、頭を走った。⼀道路を続行行ったヘッド。MROアルゴリズムは、古典的なクラスです。

多重継承の新しいクラス

MROは、クラスはそれが計算され作成されたとき、順序付けられたリストのLです。
一般式は:
(ルックアップさBASE1、BASE2の子供())MRO = [子供] +マージ(MRO(BASE2)がルックアップされる()BASE1のMRO、[BASE1、BASE2のルックアップされている])
コアアルゴリズムはC3である動作をマージ

ヘッダーとフッター

ヘッダ:
  のリストの最初の要素
トレーラー:
  (空であってもよい)テーブルの最初のセット以外の要素のリスト
例の
  リスト:[A、B、C]
  ヘッダは、BとCフッタであります

リストの間で操作+

+操作:

[A] + [B] = [A、B]
デフォルトの計算が示されています)
---------------------

merge操作示例:
如计算merge( [E,O], [C,E,F,O], [C] )
有三个列表 :  ①      ②          ③
merge不为空,取出第一个列表列表①的表头E,进行判断                              
   各个列表的表尾分别是[O], [E,F,O],E在这些表尾的集合中,因而跳过当前当前列表
取出列表②的表头C,进行判断
   C不在各个列表的集合中,因而将C拿出到merge外,并从所有表头删除
   merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] )
进行下一次新的merge操作 ......

パッケージ:

考えカプセル化された具体コンクリート研究属するモジュールにパッケージ化コードブロックを⼀する。コード固定機能パッケージ、関数、オブジェクト、のオブジェクトを⼀する大量のデータをカプセル化する。例えば、あなたは⼀Aを書きますBは⽆一見何と使用を格納⼀⼀するシステムからのコンテンツのより重要な⼀の組み合わせである。これはまた、カプセル化と呼ぶことができるという。⾯を念頭に置い対象に⽜の関数である。このパッケージにはされて
言って:定義上の包装は、どこかのパッケージの内容で、通話内容をどこかにカプセル化された後に行きます。

最初のステップ:パッケージのどこかの内容
ステップ:どこかにカプセル化されたコンテンツから呼び出しは
2例があり、パッケージコンテンツと呼ばれる場合:
オブジェクトを直接呼び出すことによって
間接的に自己によって呼び出さ

ポリモーフィック:

私たちはただ、具体的。例えば、我々はこの時点で、A = 10は、我々が知っている⼀の変数を作成しないでください。ストレートで使用し⼀ので⼀オブジェクト、様々な形態を持つ。実際には、Pythonでこれは、白い説明するのは容易ではありません整数型ですが、私たちは、プログラムA =「A」を作ることができ、その後、文字列型への個別の保証。これは、我々はすべて知っているものです。しかし、私は、これは多型である。ことを教えましょう。⼀同じ変数は、様々な形態であってもよいです。
言って:ポリモーフィズム、同じオブジェクト、様々な形態。Pythonのデフォルトサポート多状態

# 在java或者c#定义变量或者给函数传值必须定义数据类型,否则就报错。

def func(int a):
    print('a必须是数字')
    
# 而类似于python这种弱定义类语言,a可以是任意形态(str,int,object等等)。
def func(a):
    print('a是什么都可以')
    
# 再比如:
class F1:
    pass


class S1(F1):
    
    def show(self):
        print 'S1.show'


class S2(F1):
    
    def show(self):
        print 'S2.show'


# 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象

def Func(F1 obj):
"""Func函数需要接收一个F1类型或者F1子类的类型"""

    print obj.show()
    

s1_obj = S1()
Func(s1_obj)  # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

s2_obj = S2()
Func(s2_obj)  # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show

Python伪代码实现Java或C  # 的多态

アヒルタイプ

python中有一句谚语说的好,你看起来像鸭子,那么你就是鸭子。
对于代码上的解释其实很简答:
class A:
    def f1(self):
        print('in A f1')
    
    def f2(self):
        print('in A f2')


class B:
    def f1(self):
        print('in A f1')
    
    def f2(self):
        print('in A f2')
        
obj = A()
obj.f1()
obj.f2()

obj2 = B()
obj2.f1()
obj2.f2()
# A 和 B两个类完全没有耦合性,但是在某种意义上他们却统一了一个标准。
# 对相同的功能设定了相同的名字,这样方便开发,这两个方法就可以互成为鸭子类型。

# 这样的例子比比皆是:str  tuple list 都有 index方法,这就是统一了规范。
# str bytes 等等 这就是互称为鸭子类型。

制約クラス

制約はクラスである。
ことわざ:つまり、クラス規則に

クラスの2つの制約があります。

  1. その後、抽出⽗クラスとは⽗クラスで救済を定義した。この救済で乾燥して何もして。⼀それに例外をスローする。このようなクラスは、救済をオーバーライドする必要がありますすべてのサブメニューを。そうでなければ訪問ときエラーになります。..
  2. メタクラスは⽗クラスを説明した使用はして⼀抽象的救済がメタクラス与えられている。このようなクラスは、サブメニューがカメラのための抽象メソッドの特定の実装を与えるだろう。制約にも効果を果たしている可能性があります

要約:

制約は⽗実際にクラスが⾏xxxの救済に書き込まれなければならないカテゴリのサブメニューは、2つの制約は、Pythonのシャッターモード及び救済であり、サブメニュー上のクラス制約です..:

  1. JavaとC#の場合⽅源として、抽象クラスと抽象的救済を使用した。周波数を使用するので、少しです
  2. これは、より多くのことを明確にし、間違って、より専門的である。⽅珍しいケースを投げる。そしてNotImplementErrorをスローするようにしようとするフェイスを使用した。(推奨)

スーパー()の深い理解

スーパーは、継承クラスの厳密な順序で行う。
スーパー他の方法のクラスであってもよい
スーパー()厳密クラスMROの順序に従って

おすすめ

転載: www.cnblogs.com/SkyRabbit/p/11317871.html