Pythonの指向高次オブジェクト - ディスクリプタと学習デザインパターン#猿


 

 

記述子##

>クラスは、3種類のマジックメソッド( `__get __、__ __セット、__ delete__`)1、またはすべての時間が含まれている場合、このクラスが呼び出された記述子クラス

###役割

>記述子(取得、割り当て、削除)クラスのメンバーの役割が詳細な管理操作を実施します

>記述子は、クラス記述子に属する、操作部材のクラスの薬剤である、クラス属性のみが定義されています

### 3つのマジックメソッド

`` `のpython

「」」

__get __(自己、例えば、所有者)

トリガ機構:アクセス対象部材プロパティは自動的にトリガされる(部材は、記述子管理に引き渡されたとき)

役割:取得プロパティの現在の値を設定します

パラメータ:. 1自己記述子オブジェクト2は、オブジェクトクラスのメンバーによって管理されます。3.管理は、クラスのメンバーであります

戻り値:プロパティの値は、メンバーとして取得

警告:なし

__set __(自己、例えば、値)

トリガ機構:オブジェクトメンバプロパティを設定する場合は自動的にトリガされる(部材は、記述子管理に引き渡されています)

役割:メンバーの割り当てを管理するには

パラメータ:. 1自己記述子オブジェクト2は、オブジェクトクラスのメンバーによって管理されます。3.値を設定します

戻り値:なし

警告:なし

__delete __(自己、インスタンス)

トリガ機構:(メンバーはディスクリプタ管理に引き渡されたときに)あなたがオブジェクトのメンバプロパティを削除し、自動的にトリガされます

役割:削除メンバプロパティには、管理されています

パラメータ:. 1自己記述子オブジェクト2は、オブジェクトクラスのメンバーによって管理されます。

戻り値:なし

警告:なし

「」」

`` `

フル・データ記述子:( ###)

>マジックメソッドは、3つのデータ記述子クラスを持っています

###非データディスクリプタ:(不完全)

>魔法の方法は、非ディスクリプタ・クラスの3クラスを持っていないです

###基本的な使用形式

>現在のディスクリプタの属性クラスは、必要な薬のクラスのメンバーに割り当てられました

コード例:

`` `のpython

#記述子クラスを定義します。

クラスPersonNameの():

    __name = 'ABC'

    デフ__get __(自己、例えば、所有者):

        #プリント(自己、例えば、所有者)

        リターン自己.__名

    デフ__set __(自己、例えば、値):

        #プリント(自己、例えば、値)

        自己.__名前=値

    デフ__delete __(自己、インスタンス):

        #プリント(自己、インスタンス)

        #デル自己.__名

        印刷(「削除することはできません」)

一般的なカテゴリに定義された#

クラスパーソン():

    クラス記述子のクラスのメンバーに#が達成される属性

    オブジェクトクラス識別子(の別のクラス記述のメンバーの#A値)

    このクラスのメンバが動作する必要がある場合#次に、それを別のオブジェクトにその操作を理解されたいです

    名前= PersonNameの()

#インスタンス化オブジェクト

ZS =人()

印刷(zs.name)

zs.name =「ジョン・ドウ」

印刷(zs.name)

zs.nameの

印刷(zs.name)

`` `

分析的記述子の応用###

`` `のpython

#学生のクラスを定義し、学生には、ID、名前、スコアを記録する必要があります

クラス学生():

    デフ__init __(自己、ID、名前、スコア):

        self.id = ID

        self.name =名前

        self.score =スコア

    デフreturnMe(自己):

        情報= F ''」

        学生番号:{} self.id

        参加者の名前:{} self.name

        学生スコア:{} self.score

        「」」

        印刷(詳細)

「」」

#要件:生徒は0〜100の範囲でのみ得点することができます

ソリューション:

    1。スコア__init__方法の範囲内の電流を検出します

        #検出スコア範囲

        スコア> = 0とスコア<= 100の場合:

            self.score =スコア

        オブジェクトが初期化されるときに、このソリューションは、有効であることができます。

    2。SETATTR魔法を検出する方法を定義します

        割り当ては、ポイントを獲得するために検出された場合、検出決意スコア

            デフ__setattr __(自己、キー、値):

        #割り当てがスコアにあるかどうかを検出

        キー==「スコア」の場合:

            #検出スコア範囲

            値> = 0と値<= 100であれば:

                オブジェクト.__ SETATTR __(自己、キー、値)

            そうしないと:

                印刷(「現在のスコアを満たしていません」)

        そうしないと:

            オブジェクト.__ SETATTR __(自己、キー、値)

        学生は、英語での言語スコア、数学の得点、得点として、時間を行う方法よりも多くを獲得した場合

        他には、現在のコードで、このクラスでは、それのより多くのですか?

    3。思考は、このプロパティの私たちのスコアを表すための記述子を使用することができます

        1.スコア記述子クラスの定義

        プロキシクラス記述子のメンバーにクラススコア2.学生

        エージェントの中に長い分数の割り当てやアクセスなどのOKクラス記述子として3

「」」

#記述子クラススコア管理エージェントを定義します。

クラススコア():

    デフ__get __(自己、例えば、所有者):

        リターン自己.__スコア

    デフ__set __(自己、例えば、値):

        値> = 0と値<= 100であれば:

            自己.__スコア=値

        そうしないと:

            印刷(「スコアが要件を満たしていません」)

#利用記述子クラス属性のスコアは、エージェントスコア

クラス学生():

    スコア=スコア()

    デフ__init __(自己、ID、名前、スコア):

        self.id = ID

        self.name =名前

        self.score =スコア

    デフreturnMe(自己):

        情報= F ''」

        学生番号:{} self.id

        参加者の名前:{} self.name

        学生スコア:{} self.score

        「」」

        印刷(詳細)

#インスタンス化オブジェクト

ZS =学生(1011年、 '張怒っ'、99)

zs.returnMe()

zs.score = -20

zs.score = 88

zs.returnMe()

`` `

記述子は、###の3つの形式を定義します

`` `のpython

#推奨フォーマットは、クラス記述子を定義することによって達成されます

「」」

クラスScoreManage():

    デフ__get __(自己、例えば、所有者):

        パス

    デフ__set __(自己、例えば、値):

        パス

    デフ__delete __(自己、インスタンス):

        パス

クラス学生():

    スコア= ScoreManage()

「」」

達成するためにプロパティ関数を使用して#フォーマット第二に、

「」」

クラス学生():

    #直接同様の三つの方法は、このクラスで管理する必要が定義

    デフgetscore(自己):

        印刷( 'getscore')

    デフsetscore(自己、値):

        印刷( 'setscore'、値)

    デフdelscore(自己):

        印刷( 'delscore')

    #プロパティ関数、対応する方法に対応する3つの方法で指定。__get __、2。__set __、3。__delete__

    スコア=プロパティ(getscore、setscore、delscore)

ZS =学生()

#印刷(zs.score)

#= 200 zs.score

#デルzs.score

「」」

#達成するために3 @propertyデコレータ構文を使用してフォーマット

「」」

クラス学生():

    __score =なし

    @property

    デフ(自己)スコア:

        印刷(「取得」)

        リターン自己.__スコア

    @ score.setter

    デフ(自己、値)得点:

        印刷(「セット」)

        自己.__スコア=値

    @ score.deleter

    デフ(自己)スコア:

        印刷(「削除」)

        デル自己.__スコア

ZS =学生()

#印刷(zs.score)

zs.score = 199

印刷(zs.score)

デルzs.score

「」」

`` `

##デザインパターン

>デザインモードは、クラシックモードを達成するための必要条件となり、機能であるか、コードとコードの設計と実装手順の経験と教訓をもとに人間のニーズの完了前に要約してまとめています。

>

>デザインパターンコードフォーマットが固​​定されていないが、オブジェクト指向プログラミングの設計

実施例###シングル(一重)デザインパターン

>現在のスクリプトでは、同じクラスにのみ使用するオブジェクトを作成することができます。この状況は、シングルトン(一重)となります。

`` `のpython

「」」

シングルの場合の例では、考慮してください。

人は一つだけの結婚を持つことができ、特にとしてシングルトンと婚姻法の関係、

社会では一夫一婦制を完了する方法ですか?

あなたが結婚したい場合は、民事局登録に行かなければなりません

民事局、二人は結婚のような状態かどうかを確認するために、このアカウントを検出する必要があります

あなたが結婚している場合は、スラストアウトにしてください。

あなたが結婚していない場合は、チャプターを構築し、登録を開始することができます。

まあ、それにシングルトンデザインパターンのpythonを達成するためにどのように思考のこのラインに従って?

1。あなたは、現在のオブジェクトを作成するプロセスを制御するために移動するための方法を持っている必要がありますか?

    コンストラクタ__new__

2。オブジェクトが存在するかどうかを示す店舗とラベルする必要があります

    ストレージのための私有財産を作成すると、デフォルト値なし

3。オブジェクトの作成の過程で検出したオブジェクトがあるかどうかを判断するには?

    あなたは、オブジェクトのオブジェクトを作成し、オブジェクトが格納されていない場合は、オブジェクトを返します

    ストレージがオブジェクトである場合は、直接オブジェクトを返すには、新しいオブジェクトを作成する必要はありません。

「」」

クラスデモ():

    #2は、プライベート属性に格納されたオブジェクトを定義し、デフォルト値なし

    __obj =なし

    1.定義コンストラクタ#

    デフ__new __(CLS、* argsを、** kwargsから):

        #3。オブジェクトを作成するプロセスでは、オブジェクトが存在するか否か

        そうでない場合はCLS .__ OBJ:

            #判事はありませんオブジェクト場合は、そのオブジェクトが作成され、保存されています

            CLS .__ OBJ =オブジェクト.__新しい__(CLS)

        #オブジェクトのストレージに直接返されます

        CLS .__ OBJ戻ります

#インスタンス化オブジェクト

=デモ()

B =デモ()

プリント(A)

印刷(B)

「」」

<__ __メイン。0x106f4d850でデモオブジェクト>

<__ __メイン。0x106f4d850でデモオブジェクト>

「」」

`` `

### MIXIN混合デザインパターン

#### MIXINクラス

+ MIXINはなくオブジェクトよりも、機能を表現しなければなりません。

+ミックスイン機能は、複数の機能が存在する場合、それはより多くの定義されたミックスインクラスになり、単一でなければなりません

+ミックスインでのPythonは多重継承を介して達成されます。

+ MIXINこのクラスは、通常、単独で使用されないが、増加した他のクラスの混合物、機能

+ミックスインクラスは、子供がこのクラスミックスインを継承していない場合でも、サブクラスが適切に実行することができ、実装サブクラスに依存しない、それはいくつかの機能を欠いている可能性があります。

混合ミックスインクラスを使用しての####の利点?

設計パターン1 MIXIN混合クラスでは、クラスは、修飾された前提の内容でないクラスの機能を拡張します

コードの再利用性を向上させるために2 MIXIN混合型、そのようなコード構造簡単、クリア

3.関数は、複雑なマルチレベルデザインの継承を避けるために(新しいミックスイン混合クラスを作成する)の開発に応じて調整する必要があるかもしれません。

例:

`` `のpython

「」」

継承承継のために必要な前提条件の必要性は「 - 」が関係する必要があります

例えば:

    Appleは果物であるため、Appleは、果物を継承するために行くことができます

    Appleはない継承ランチ、昼食にはリンゴあり得ないことができるので、

    車自体が車両であるので、そのようなものとして自動車は、継承することができます

何の車?

車、飛行機、ヘリコプター、これらの車両があります

それでは、どのような関係、それのこれらの種類を設計するには?

例えば、車両のクラスを作成した後、達成するために行くために、車両に属するすべてを継承します。

しかし、航空機やヘリコプターが飛行機能を持っている、と車がなかったフライトは、この関数を定義する場合は、車両に、それは適切ではありません。

それぞれ、この機能を実現するためには、飛行機やヘリコプタークラスで飛ぶんだろうか?はい、しかし、あなたは、コードを再利用することはできません。

方法は?

別のクラスの車両、航空機及び2つの親クラスを定義するには、この航空機やヘリコプターは、これらの二つのカテゴリーを継承するために行くことができます。

「」」

#輸送車両

クラス車両():

    財の#交通

    デフフオ(自己):

        印刷(「物資の輸送」)

    #キャリーの乗客

    デフ(自己)REN:

        印刷(「乗客を運びます」)

航空機#

クラスFlyingMixin():

    デフ(自己)飛びます:

        印刷(「離陸することができます...」)

#DEFINEオートモーティブ

クラスカート(車):

    パス

#DEFINE航空機

クラスの飛行機(車、FlyingMixin):

    パス

#defineヘリコプター

クラスのヘリコプター(車両、FlyingMixin):

    パス

クラス飛行する航空機を定義するには、この時点で#、その飛行体、直接このクラスを継承します。あなたはこの問題を解決することができます。

しかし、#1。反し多重継承クラスが表示されますが、「ある-」2。航空機のこのタイプは、簡単に誤解することができます

#ソリューションは、多重継承を使用することですが、このクラスの航空機に、ミックスミックスインクラスとして定義されます

この時点で、航空機は、他のクラスを拡張するための拡張の関数として、このクラスの#に等しいです。

「」」

上記のコードでは、ヘリコプター及び航空機がFlyingMixin継承される多重継承を使用しているものの

しかし、このFlyingMixinクラス名ミーニンの添加による、コードを読むの後ろに男を告げ、このクラスは、クラスのミックスインであります

「」」

`` `

###抽象クラス(知っています)

>抽象クラスは、特別なクラスです。

直接インスタンス化できない抽象クラスを使用することができない> 1は、対象となります。

> 2.抽象クラスが抽象メソッドを含む、方法が抽象メソッドの実装コードはありません。

> 3.抽象クラスは、継承するサブクラスを必要とし、親クラスの抽象メソッドをオーバーライドします。あなたが使用する前に。

`` `

抽象クラスは、一般的な機能やニーズの一般的なアプリケーションは、そのうちのいくつかは明確であるとニーズを完了することが、プログラミング、プログラム設計に計画します

しかし、また、いくつかの需要があるかもしれない、明確ではないが、または特定のニーズを達成する方法がわかりません

それではあなたは抽象メソッドとして定義され、達成するために移動するには、この不確実性や必要性の背後にある方法を達成するためにどのように置くことができる(唯一のメソッド名を定義し、ない書き込み特定のコード)

アプリケーションの抽象クラス:

    例えば、いくつかの基本的な機能と拡張を持っているフレームワークを開発します。

    しかし、あなたは、特にどのような人々のフレームワークと製品開発、開発フレームワークの知っているか、またはOKません。

    そのため、フレームワークは、特定の機能を持って、残りの定義は方法で独自の特定のビジネス・ロジックを達成するために必要とされる方法のいくつかを残します。

`` `

抽象クラス定義:

`` `のpython

輸入ABC

#あなたは抽象クラスを定義したい場合は、このクラスのメタクラスのプロパティでなければなりませんメタクラス= abc.ABCMeta

クラスWriteCode(メタクラス= abc.ABCMeta):

    飾るためにデコレータを使用して#必要な抽象メソッド、

    @ abc.abstractmethod

    デフwrite_php(自己):

        パス

    デフwrite_java(自己):

        (「コードは、Javaの開発を達成するために」)印刷

    デフwrite_python(自己):

        印刷(「pythonの開発コードを達成」)

#抽象クラスは、直接オブジェクトをインスタンス化することはできません

#OBJ = WriteCode()

#プリント(OBJ)

#TypeError:抽象メソッドのwrite_phpとすることはできませんインスタンス化する抽象クラスWriteCode

#抽象クラス継承するサブクラスを定義し、抽象クラスの抽象メソッド

クラスデモ(WriteCode):

    デフwrite_php(自己):

        印刷(「開発PHPを達成するためのコード」)

=デモ()

プリント(A)

a.write_java()

a.write_php()

a.write_python()

`` `

マスタリーはとして追い越すために曲がる、方法を学びます!

APEに学ぶ:ちょうどブティック、独自の成果を!

おすすめ

転載: www.cnblogs.com/itxdl/p/12522554.html