高度なオブジェクト指向(アイテムシリーズ、__ __新しい、__ハッシュ__、__ eq__)
A、アイテムシリーズ
GetItem関数は、SetItem関数は、delitem(動作中に得られた結果は、実際にはCRUD)
クラスはFoo: DEF __init__ (セルフ、名前、年齢、性別): self.name = 名 self.age = 年齢 self.sex = セックス DEF __getitem__(セルフ、アイテム): #とF [ 'XX']フォームに対応する IF はhasattr (セルフ、項目): リターンセルフ__dict__ [商品] DEF __setitem__(セルフ、キー、値): #とF [ 'XX'] = ' SS' に対応するフォーム 。自己__dict__ [キー] = 値 DEF __delitem__であり、(セルフキー): #そしてデル・F [ 'XX']を形成するために対応した デルの自己を。__dict__ [キー] F =はFoo(' エゴン'、30、' M ' ) を印刷(F [ ' 名前' ]) # F [ '名前'] ---オブジェクト[「XX」] __getitem__前述の方法をトリガするこの形態は、アイテムに渡される名前 # オブジェクト名のプロパティを取得するように支持され、f.nameある属性に通常取ら F [ 「趣味」 ] = 「M 」 #新たに追加された値とキー、元の辞書に__setitem__方法、及び対応するプロパティ値をトリガー プリント(F [ 「趣味」]、f.hobby) #Fに新しいプロパティを取るように[「趣味」]、f.hobby元の通常値 #デルf.hobby#削除通常の方法の #1 このとき#が与えられているプリント(f.hobby)、ショー:はAttributeError 「foo」でオブジェクトの属性がNO「趣味」を持つ デル・ F [ 「趣味」] #を使用すると、この手順を実行する場合、表示されます:はAttributeError:__delitem__、このメソッドのショーはありません #この方法あなた削除トリガー__delitem__方法、クラスの前でそのメソッドの定義持たなければならないだろう 印刷(Fを。__dict__) #趣味のない属性が辞書ありません
結果:
C:\ Users \ユーザー3-2 \ PycharmProjects \無題\ venv \スクリプト\ python.exeのC:/ユーザー/ 3-2 / PycharmProjects /無題/ 高度の.pyオブジェクト指向 エゴン・ M M { ' セックス':' M '、「年齢」 30は、「名前」:「エゴンは」} コード0を終了終了を処理します
これは、直接、例えば実装プロセス辞書、リスト、及び内側に、そのアイテムのシリーズ理由は、このメカニズムが存在し、ブラケットトーンで使用することができます
これは、直接実装プロセス辞書に例えばブラケットトーン、リストに使用することができ、内部そのアイテムシリーズの理由は、このメカニズムがあり
、それが直接デルf.hobbyを与えられずにできるように、オブジェクトのネイティブサポート__delattr__が、しかしデルF [「趣味」]は、それらの実現により得られ、
これが存在する場合場合__delitem__ないクラスメソッドは、与えられません
二、__ new__
__init__:初期化方法
__new__:コンストラクタ、オブジェクトを作成します。__new__自己が構築され、すなわち__new__方法は、自己生成された機構である
通常__new__を行う方法を使用する必要がなく、以下の実施例は、簡単にそれを使用する方法について記載されています。
クラスA: DEF __init__ (セルフ): self.x。= 1つの 印刷(' init関数で' ) DEF __new__(CLS、* argsを、** kwargsからは): #はさらに__new__を実行する前に、デフォルトのパラメータのCLSを渡しますいいえ自己が、我々は唯一の着信クラス転送することができます 印刷(「新新機能で」) の戻りオブジェクトを。__new__(、*引数を、** kwargsから) #のオブジェクトを.__新しいオブジェクトを作成new__、そのオブジェクトが渡されます自己を実行するときにはオブジェクトを使用できるように自己の位置、 ()= #は、インスタンス化された第一__new__方法を実行し、その後メソッド__init__を行います
結果:
新機能 で初期化機能の 終了コードで終了したプロセス0
典型的な設計パターン(23種類):Singletonパターン
Singletonパターン:クラスは、常に唯一のインスタンスであり、このクラスの最初のインスタンスは、オブジェクトのインスタンスを作成するとき場合、再度インスタンス、
オブジェクトは、以前に作成し使用します。
例:#は、Singletonパターンを達成
クラスA: __instance = Falseの #プライベート静的変数を使用する他の人を望んでいない、独自のセットを通過する必要が DEFの __init__ (セルフ、名前、年齢): self.name = 名前 self.age =を年齢 DEF __new__(CLS、* argsを、** kwargsから): IF。CLS __instance: #trueの場合、以下のコードを実行した場合には、それ以外の背後にあるコード #の第二は、との行に入って来た リターン CLS。__instanceの #最初の自己への復帰の前に作成されたオブジェクトに直接再臨 CLS。__instance =オブジェクト。__new__ () #__instanceであるため、最初のコード行を実装して、偽=に来た #の使用目的は、.__クラスAの新しいオブジェクトを作成し、そのインスタンスに割り当てられたnew__ .__ CLSが 返す CLSを。__Instance #ここでは新しいですオブジェクトリターンバック エゴン =(「卵」、38 ) #は本当にオブジェクトと、それは自己の内部にあるオブジェクトのメモリをインスタンス化しますが、ここではオブジェクトは常にオブジェクト.__ new__作成し、使用することです #を、彼らが目標を持っているので、 、内部オブジェクトを使用する必要はないであろう #の方法の単一の実施形態を使用するとにかく可能に理由を__new__ egon.cloth = 「ジャケット小花」 Nezha =(「Nazha 」、25 ) nezha.shoes = ' 小さいです白い靴" 印刷(Nezha) 印刷(エゴン) #は、結果の表示メモリアドレスを操作すると、二回目は、最初のインスタンスの後にインスタンス化されると言うことですつまり、同じであるに基づいて、ここで実行 #のオブジェクト操作が、再び別のものを作成していません同一の伝送パラメータと元のオブジェクトの2番目のインスタンスがあれば、メモリを表すオブジェクト #場合は、パラメータ値が上書きされる元のパラメータの転送部のみ属性、同じカバー、オリジナルの第二の例であり続ける #で既存のオブジェクトの性能の 印刷(nezha.name) 印刷(egon.name) #エゴン・オリジナルの名前がnezhaカバーされている、ここで実行して 印刷します(nezha.cloth) #は、ここに布の元エゴンをします実行しますnezhaに身に着けるように続けます
結果:
< __main__ 0x0000025C0C2293C8で.Aオブジェクト> < __main__ .A 0x0000025C0C2293C8におけるオブジェクト> nazha nazha 小花袄
三、__ hash__
#定義__hash__方法が存在しない場合、ハッシュはなく、異なるオブジェクト属性の場合よりも、メモリアドレスは、ハッシュ結果は同じではない、メモリ・アドレスに向けられ
たクラス:A
DEF __init__ (セルフ、名前、性別):
セルフ.nameの =名
A = A( ' EGN '、 ' M ' )
B = A( ' エゴン'、 ' NV ' )
プリント(ハッシュ(A))
プリント(ハッシュ(B))
結果:
154259419512 154259419617
#:-__ hash__方法を定義した後、異なるハッシュ値も異なる属性、同じプロパティの同じハッシュ値となる クラスA: DEF __init__ (セルフ、名前、性別): self.name =名 self.sex =セックス DEF __hash__ (自己): 戻りハッシュ(self.name + self.sex) A = A( ' エゴン'、 ' M ' ) B = A( ' エゴン'、 ' M ' ) C = A( ' エゴン'、 'NV ' ) プリント(ハッシュ()) プリント(ハッシュ(b)参照) 、印刷(ハッシュ(C))
結果:
8385798543724353936 8385798543724353936 -7270162062837990016
四、__ eq__
NOの場合__eq__方法、両方のメモリアドレス比較は比較である: クラスA: DEF __init__ (セルフ、名): self.name = 名 OBJ1 = A(' 卵' ) obj2が = A(' 卵' ) を印刷( == OBJ1 obj2が) #定義がありません__eq__方法デフォルトの比較メモリアドレスを比較すると、上の2つのメモリアドレスが同じではありません
結果:
偽
#__eq__設定方法_eq_トリガー'=='、コンテンツを実行する独自の方法を定義することができ
、クラスA:
DEF __init __(自己、名):
self.name =名
(他の自己、)DEFの__eq __:
IFセルフ== other.name .nameの:
trueを返し
、他:
偽リターン
OBJ1 =( '卵')
obj2が= A( '卵')
OBJ3 = A( 'EGG')
印刷(OBJ1 == obj2が)がトリガ#に等しいです__eq__
印刷(obj2が== OBJ3)#がトリガ__eq__に等しいです
結果:
真
偽
終了コードで終了したプロセス0