python-09魔法の方法、特徴とイテレータ

#章IXの魔法のメソッド、プロパティとイテレータ
#9.1あなたは3 Pythonの使用していない場合は、

#9.2のコンストラクタ
初期化するために、#__init__を
オブジェクトが破棄される前に、#__del__デストラクタ呼び出された

#9.2.1オーバーライド一般と特別な施工方法を関数
クラス鳥:
DEF __init __(自己):
self.hungry = Trueの
DEFがEAT(セルフ):
:self.hungry IF
印刷( 'AAAAH .....')
self.hungry = Falseの
他:
印刷(「いいえ、おかげで')

クラスソングバード(鳥):
DEF __init __(自己):
#Bird .__のinit __(自己)#9.2.2に追加する必要がある
スーパー().__のinit __()
self.sound ='スコーク「!
DEFシング(セルフ):
印刷(self.sound)
SB =ソングバード()
印刷(sb.sing())
印刷(sb.eat())# 'ソングバード'オブジェクトの属性がNO '空腹'は
#9.2.2スーパークラスのコンストラクタ呼び出しは、INIT __ .__ #Bird(セルフ)関連付けられていない

スーパー#スーパーを使用して#9.2.3の機能を()。 __init __()

#9.3の要素のアクセス
#9.3.1基本シーケンスおよびマッピングプロトコル

DEF check_index(キー):
'' '
指定されたキーインデックスが許容できるのですか?

キーは非負の整数でなければならない、それが許容可能です。そうでない場合は、整数、TypeError例外、それが負の場合、イニシエータIndexError例外(配列の長さは無限であるため)

「」"
IFないでisinstance(キー、INT):
昇給はTypeError
IFキー<0:
昇給はIndexError

クラスArithmeticSequence :
DEF __init __(自己、START = 0、STEP = 1):
'' '
の演算シーケンスを初期化

:PARAM開始:シーケンスの最初の値
:PARAMステップ2つの隣接する価値の差
'
=スタートself.startの
self.step = STEP
self.changed = {}
DEF __getitem __(自己、キー):
'' '
演算素子配列から得られるA
' ''
check_index(キー)を
試してください:
リターンself.changed [キー]
A KeyError例外を除い:
戻りself.start +キー* self.step

DEF __setitem __(自己、キー、値):
'' '
修飾された演算素子配列
' ''

check_index(キー)

self.changed [キー] =値

= ArithmeticSequence (5 ,. 6。)
(A [5])を印刷

リスト由来#9.3.2、辞書とSTR

クラスCounterList(一覧):
DEF __init __(自己、*引数を):
スーパー().__のinit __(*引数)
self.counter = 0
DEF __getitem __(自己、インデックス):
。self.counter + = 1つの
リターンスーパー(CounterList、セルフ).__のgetItem __(インデックス)

のCl = CounterList(レンジ(10))
を印刷(CL)
を印刷(cl.counter)
のCl [4] + Clで[2]
印刷(cl.counter)

#9.4#あなたがより多くを学ぶために他の魔法のメソッドが必要な場合は、特別なメソッド名の」手動Pythonのリファレンスを参照してください。

#9.5アクセスメソッドによって定義された特性は、多くの場合、特性属性と呼ぶ
' ''
クラス長方形
DEF __init __(自己):
self.width = 0
self.height = 0
DEF set_size(セルフ、サイズ):
self.width、self.height =サイズ
DEF GET_SIZE(自己):
戻りself.width、self.height

=矩形R&LT()
r.width = 10
r.height。5 =
プリント(r.get_size())
r.set_size((150、100))
印刷(r.width)
'' '
#9.5.1機能プロパティ
クラス長方形:
DEF __init __(自己):
self.width = 0
self.height = 0
DEF set_size(セルフ、サイズ):
self.width、self.heightサイズ=
DEF GET_SIZE(自己):
戻りself.width、self.height
サイズ=プロパティ(GET_SIZE、set_size)

R&LT =矩形()
r.width = 10
r.height。5 =
プリント(r.size)
r.size = 150、100
プリント(r.width)
'' '
の機能性を呼び出すとき、しないかもしれませんパラメータを指定するパラメータ指定、パラメータ指定、3つまたは4つのパラメータが指定されています。
あなたが任意のパラメータを指定しない場合、機能はどちらも読み取ることも書き込みます作成します。
あなたが唯一のパラメータ(取得方法)を指定した場合、作成されたプロパティは読み取り専用になります。
第三のパラメータはオプションであり、(この方法は、任意のパラメータを受け付けない)属性を削除するために使用される方法を指定します。
第四パラメータはオプションで、文書の文字列を指定します。これらのパラメータはFGET、FSET、FDELおよびドキュメントを命名しています。
あなたは書き込み専用の文書を作成したいとプロパティの文字列を使用している場合、彼らは重要なパラメータとして実装することができます。
手引きガイド記述子(https://docs.python.org/3/howto/descriptor.html
「」 '
#9.5.2静的メソッドとクラスメソッド
#静的メソッドとクラスメソッドは、この方法で作成されています。彼らは、staticmethodにパックされていますクラスメソッドとオブジェクトクラス。
定義#の静的メソッドは、パラメータなしの自己を取りませんが、直接クラスのクラスによって呼び出すことができる
セルフ同様のパラメータ、一般的に名前のCLSを備え定義#メソッド。クラスのメソッドのために、とすることもできます直接呼び出すオブジェクトが、自動的にクラスにリンクされたパラメータのCLS。''
'
MyClassクラス:
DEF smeth():
印刷('これは、静的メソッドです')
smeth = staticmethod(smeth)

DEF(CLS)をcmeth:
印刷('このISの方法Aクラス'CLS)
cmeth = Aクラスメソッド(cmeth)
' ''
際に指定#デコレータデコレータ複数の、列挙されたアプリケーションへ順反対)
MyClassクラス:
@staticmethod
DEF smeth():
プリント( '静的メソッドこれはA')
@classmethod
DEF cmeth(CLS):
印刷( 'ISのこのクラスAメソッド'、CLS)

印刷(MyClass.smeth())
を印刷(MyClass.cmeth())

#* 9.5.3 __getattr __、__のようなsetattr__
' ''
。1、__ __のgetAttribute(セルフ、名前) :プロパティは自動的に呼び出しアクセスされたとき(新しいクラスにのみ適用)。
図2に示すように、__ GETATTR __(自己、名): 自動的にプロパティがアクセスされたときに呼び出されると、オブジェクトはそのような性質ではありません。
3、__ SETATTR __(自己、名前、値): プロパティの割り当てを与えるためにしようとしたときに自動的に呼び出されます。
4、__ delattr __(自己、名): 削除のプロパティにしようとしたときに自動的に呼び出されます。
「」 '


#は9.6イテレータ__iter__
#9.6.1 __iter__イテレータプロトコルは、次に(IT)__next__この方法イテレータオブジェクトを返し、それが含む.__次__()同値
クラスのFIB:
デフ__init __(自己):
self.a = 0
self.b = 1
DEF __next __(自己):
self.a、self.b = self.b、self.a + self.b
リターンself.a
DEF __iter __(自己) :
リターン自己

のFIB =のFIB()
のFIBでのfに対する:
プリント(F)
:F> 1000かの
休憩

#9.6.2从迭代器创建序列
クラスTestIterator:
値= 0
defは__next __(自己):
self.value + = 1
もしself.value> 10:
昇給を呼び出すとStopIterationの
リターンself.value
デフ__iter __(自己):
リターン自己
TI = TestIterator()
プリント(リスト(TI))

#9.7ファンクション・ジェネレータは、ジェネレータと呼ばれるyield文を含む
発電機を作成#9.7.1
'「」
:DEF平坦化(ネスト)
:サブリストネストのために
:サブリスト要素に対する
収率要素が
[[=ネスト1,2 。]、[3 ,. 4]、[5]。

プリント(リスト(平坦化(ネスト)))
プリント(平坦化(ネスト))
'' '
#* 9.7.2再帰ジェネレータ
' ''
DEF平坦化(ネスト):
試してみる:
#がないような文字列を反復可能オブジェクト
試してください。
「+ネストされた」
TypeError例外を除い:

他:
昇給の例外TypeError
のsubListにネストについて:
フラット化の要素(のsubList)について:
収量要素
TypeError例外を除い:
収率ネストされた
プリント(リスト(フラット化([。。。[1]、[2] ,. 3、 'AS' ,. 4、[5、[6 ,. 7、 'SD']] ,. 8])))
'' '
イテレータジェネレータ機能及びジェネレータ:生成9.7.3一般#発生器は、2つの別個の部分からなります。
声明DEFファンクションジェネレータ#が歩留まりを含む、定義されています。この関数の結果を返すイテレータジェネレータがされ

#Builderの9.7.4メソッドの
#の外の世界:ジェネレータがお送り外の世界にアクセスする方法を、この方法は、次のと似ていますが、(「メッセージ」を送信するようにパラメータを受け入れます、それは)任意のオブジェクトにすることができます。
#ビルダー:インサイド・ジェネレータは保留中、収率は表現ではなく、文として使用することができます。言い換えれば、発電機が再び実行されている場合、
#は、降伏値を返します-送信を介して外部の世界から送信された値を。あなたは次の使用している場合は、収率がNoneを返します。
「」 '
メソッドスロー:例外(収率式で)ビルダーのために上昇することは例外を提供することができる場合、コールタイプ、任意の値とトレースバックオブジェクト。
方法は近い:あなたが呼び出すときに引数を与えることなく、発電を停止します。
'' '

#9.7.5シミュレーションジェネレータ
DEFフラット化(ネスト):
結果= []
してみてください:
#がないような文字列をイテレート可能オブジェクト
試してください。
+ネストされた''
TypeError例外を除い:

他:
昇給の例外TypeError
のsubListにネストについて:
フラット化の要素(のsubList)について:
result.append(要素)
TypeError例外を除い:
result.append(ネストされた)
リターンリザルト
。印刷(フラット化([[[1 ]、2] ,. 3、 'AS' ,. 4、[5、[6 ,. 7、 'SD']] ,. 8]))

#8女王の9.8



'' '
配列と実質的にマッピング要素(アイテム)の彼らの基本的な動作(プロトコル)を達成するために設定され、2つの不変オブジェクト、メソッド、4つの変更可能なオブジェクトを実装する必要性を実装する必要があります。
1、__ LEN __(自己) : -対数値この方法は、コレクション内のアイテムの数が含まれるべき返し、それが配列の要素数であり、マッピングは結合です。__len__リターンがゼロの場合
(この行動__nonzero__のカバレッジを達成していない)、オブジェクトがfalseとみなされている(空のリスト、タプル、文字列や辞書のように)ブール値のコンテキストになります。
2、__ __getitem __ __(自己、)キー:このメソッドは、指定されたキーに関連付けられた値を返す必要があります。配列は、キーは、(後述する負であってもよい)0〜N-1の整数でなければなりません
ここで、Nはシーケンスの長さです。マッピングは、キーは、任意のタイプにすることができます。
図3に示すように、__ SetItem関数__(自己、キー、値): このメソッドは、__getitem__を得るために後に使用される格納されたキーに関連する値に関連付けられるべきです。もちろん、変更可能なオブジェクトは、このメソッドを実装する必要がある場合のみ。
図4に示すように、__ delitem __(自己、キー): このメソッドは、オブジェクトの組成の__del__ステートメントを使用するときに呼び出され、キーに関連付けられた値は削除されなければなりません。同様に、場合にのみ、オブジェクト変数(それは、エントリが削除される可能)
のみ、このメソッドを実装する必要があります。

キーが負の整数である場合配列については、番号が末尾を転送すべきです。換言すれば、Xは[-n]は[LEN(X)-N]等価Xであるべきです。
キータイプは、不適切(例えば、文字列のキーシーケンスを使用して)、例外を例外TypeErrorできる場合。
配列について、インデックス・タイプが正しいが、範囲はIndexError例外をトリガすることを許可されていない場合。
9.9概要
新しいクラスとレガシークラス:Pythonが変化する方法で、労働者階級。Pythonの2の新しいバージョンでは、2つのクラスがあり、古いクラスが急速に舞台を離れています。
新しいクラスはPython 2.2で導入され、それは、スーパーや財産支援機能など、いくつかの追加機能を提供しますが、古いクラスがサポートしていません。新しいクラスを作成するには、直接的または間接的にオブジェクトまたはセット__metaclass__を継承しなければなりません。
マジック:名前起動し、2つの下線で終わるPythonで特別な方法、がたくさんあります。これらのメソッドの機能は異なりますが、ほとんどの特定の状況下でのPythonによって自動的に呼び出さ。オブジェクトが作成された後たとえば、__init__が呼ばれます。
コンストラクタ:多くのオブジェクト指向言語は、あなたが書かれていることを各クラスのコンストラクタを持っている、あなたはそれのためのコンストラクタを実装する必要があるかもしれません。オブジェクトが作成された後__init__という名前のコンストラクタは、自動的に呼び出されます。
書き換え:たスーパークラスで定義されたメソッド(および他のプロパティ)リライタブルタイプ、メソッドは、この目的のために実施されてもよいです。直接スーパークラスを呼び出すことにより、書き換えられたバージョンを呼び出すには関連していないバージョン(旧タイプ)は、関数のスーパー(新しいカテゴリー)を呼び出すために使用することができます。
シーケンスやマップ:カスタムシーケンスまたはマッピングを作成するには、すべてのメソッドが__getitem__と__setitem__や他の魔法の方法を含め、シーケンスおよびマッピングプロトコルを指定し実装する必要があります。リスト(またはのUserList)と辞書(またはUserDict)から導出することで、ワークロードの多くを減らすことができます。
イテレータ:簡潔に述べると、を含む方法__next__イテレータオブジェクト、使用反復可能な値のセット。ノー代替反復法__next__呼び出すとStopIteration例外がある場合は、より多くの価値につながるはず。__iter__を含むイテラブル方法は、
それがイテレータのような配列は同じループのために使用することができる返します。典型的には、反復子は、反復、すなわち、反復子自体を含む方法が__iter__返しもあります。
ジェネレータ:ファンクション・ジェネレータは、キーワード収率はイテレータの特別な種類であることが呼ばれる発電機を、返す関数であるが含まれています。投げると近い、方法がお送り使用して、アクティブと対話生成するには。
8つのクイーン問題:8つのクイーン問題は、発電機は簡単に解決することができます使用して、コンピュータサイエンスの有名な問題です。ボード上の8つのクイーンを置くこと、そして何のクイーンがお互いを攻撃することはできませんことを保証するための問題。

ITER(OBJ)はイテラブルからイテレータを作成するために、
次の(IT)、更にと前イテレータの次の要素を返す
プロパティ(FGET、FSET、FDEL、 DOC) 特性を返し、すべてのパラメータはオプションである
(クラススーパー、OBJ)はスーパークラスの関連するインスタンスを返します
『』 '


おすすめ

転載: www.cnblogs.com/fuyouqiang/p/11844650.html