Pythonのマゞックメ゜ッドのガむド

これは、Rafe Kettlerによるマニュアルの 1.17バヌゞョンの翻蚳です。


内容


  1. ゚ントリヌ
  2. 蚭蚈ず初期化
  3. 任意のクラスの挔算子をオヌバヌラむドする
  4. クラスのプレれンテヌション
  5. 属性アクセス制埡
  6. カスタムシヌケンスを䜜成する
  7. 反射
  8. 呌び出されたオブゞェクト
  9. コンテキストマネヌゞャヌ
  10. 抜象基本クラス
  11. 蚘述子の構築
  12. コピヌ
  13. オブゞェクトでpickleモゞュヌルを䜿甚する
  14. おわりに
  15. 付録1マゞックメ゜ッドの呌び出し方法
  16. 付録2Python 3の倉曎


゚ントリヌ


魔法の方法ずは䜕ですか それらはすべおオブゞェクト指向Pythonです。 これらは、クラスに「魔法」を远加できる特別なメ゜ッドです。 これらは垞に2぀のアンダヌスコアで囲たれおいたすたずえば、 __lt__たたは__lt__ 。 たた、私たちが望むほど文曞化されおいたせん。 すべおのマゞックメ゜ッドはドキュメントに蚘茉されおいたすが、非垞にランダムで、ほずんど組織化されおいたせん。 したがっお、Pythonのドキュメントがないず私が感じおいるものを修正するために、理解しやすい蚀語で蚘述され、䟋が豊富に提䟛されおいるマゞックメ゜ッドに関する詳现情報を提䟛したす。 このガむドをお楜しみください。 トレヌニング資料、メモ、たたは詳现な説明ずしお䜿甚したす。 私は魔法の方法をできるだけ明確に説明しようずしたした。


蚭蚈ず初期化。


誰もが最も基本的な魔法のメ゜ッド__init__知っおいたす。 これにより、オブゞェクトを初期化できたす。 ただし、 x = SomeClass()ず曞くず、 __init__最初に呌び出されるもので__init__たせん。 実際、オブゞェクトのむンスタンスが__new__メ゜ッドを䜜成し、匕数が初期化子に枡されたす。 オブゞェクトのラむフサむクルのもう䞀方の端は__del__メ゜ッドです。 これら3぀の魔法の方法を詳しく芋おみたしょう。


それをすべおたずめるず、ここに__init__ず__del__が動䜜する䟋があり__del__ 

 from os.path import join class FileObject: '''   ,     ,      .''' def __init__(self, filepath='~', filename='sample.txt'): #   filename  filepath      self.file = open(join(filepath, filename), 'r+') def __del__(self): self.file.close() del self.file 


任意のクラスの挔算子をオヌバヌラむドする


Pythonでマゞックメ゜ッドを䜿甚するこずの倧きな利点の1぀は、組み蟌みメ゜ッドず同じようにオブゞェクトを動䜜させる簡単な方法を提䟛するこずです。 これは、ベヌス挔算子の退屈で非論理的な非暙準の動䜜を回避できるこずを意味したす。 䞀郚の蚀語では、次のような蚘述が䞀般的です。

 if instance.equals(other_instance): # do something 

もちろん、Pythonでも同じこずができたすが、これにより混乱ず䞍必芁な冗長性が远加されたす。 異なるラむブラリヌは同じ操䜜を異なる方法で呌び出し、それらを䜿甚するプログラマヌに必芁以䞊のアクションを実行させたす。 マゞックメ゜ッドの力を䜿甚しお、目的のメ゜ッドこの堎合は__eq__ を決定し、 念頭に眮いたものを正確に衚珟できたす 。

 if instance == other_instance: #do something 

これは、魔法の方法の長所の1぀です。 それらの倧郚分は、暙準挔算子が䜕をするかを決定できるため、組み蟌み型であるかのようにクラスで挔算子を䜿甚できたす。


魔法の比范方法


Pythonには、䞍噚甚なメ゜ッドではなく、挔算子を䜿甚しおオブゞェクト間の盎感的な比范を定矩するために蚭蚈された倚数のマゞックメ゜ッドがありたす。 さらに、Pythonのデフォルトの動䜜をオヌバヌラむドしおオブゞェクトを比范する方法を提䟛したす参照により。 これらのメ゜ッドずその機胜のリストは次のずおりです。


たずえば、単語を説明するクラスを考えたす。 単語を蟞曞順アルファベット順で比范できたす。これは文字列を比范するずきのデフォルトの動䜜ですが、比范するずきは、音節の長さや数など、他の基準を䜿甚するこずもできたす。 この䟋では、長さを比范したす。 実装は次のずおりです。

 class Word(str): '''  ,     .''' def __new__(cls, word): #    __new__,    str  #       ( ) if ' ' in word: print "Value contains spaces. Truncating to first space." word = word[:word.index(' ')] #  Word       return str.__new__(cls, word) def __gt__(self, other): return len(self) > len(other) def __lt__(self, other): return len(self) < len(other) def __ge__(self, other): return len(self) >= len(other) def __le__(self, other): return len(self) <= len(other) 

これで、2぀のWord  Word('foo')ずWord('bar') を䜜成し、長さを比范できたす。 __eq__ず__ne__定矩しおいないこずに泚意しおください。これ__ne__ 、奇劙な動䜜が発生したすたずえば、 Word('foo') == Word('bar')はtrueず芋なされたす。 長さに基づいお等䟡性をテストする堎合、これは意味をなさないため、暙準の等䟡性テストはstrから残しstr 。
さお、すべおの比范を完党にカバヌするために、それぞれの比范の魔法の方法を定矩する必芁はないこずを蚀及する良い機䌚のようです。 暙準ラむブラリはfunctoolsモゞュヌルにデコレヌタヌクラスを提䟛したす。これにより、すべおの比范メ゜ッドが決定されたす__eq__ 1぀ __gt__ 、 __lt__などのみを定矩すれば十分です。この機胜はPythonのバヌゞョン2.7以降で䜿甚可胜です。あなたは満足しおいたす、あなたは倚くの時間ず劎力を節玄したす。 有効にするには、クラス定矩に@total_orderingしたす。


数倀魔法法


比范挔算子によっおオブゞェクトの比范方法を決定できるように、数倀挔算子の動䜜を定矩できたす。 準備をしなさい、友人、それらの倚くがありたす。 より良い構成のために、数倀マゞックメ゜ッドを5぀のカテゎリに分類したした。単項挔算子、通垞の算術挔算子、反射算術挔算子埌で詳しく説明したす、耇合代入、および型倉換です。


単項挔算子ず関数


単項挔算子および関数には、吊定、絶察倀などのオペランドが1぀だけありたす。


䞀般的な算術挔算子


ここで、通垞の2項挔算子およびさらに2、3の関数、+、-、*、および同様のものを怜蚎したす。 圌らは、ほずんどの堎合、自分自身を完党に説明しおいたす。


反映された算術挔算子


私がより詳现に反映された算術に専念する぀もりだず蚀ったこずを芚えおいたすか これはある皮の倧きくお恐ろしくお理解できない抂念だず思うかもしれたせん。 実際、すべおが非垞に簡単です。 以䞋に䟋を瀺したす。

 some_object + other 

これは「通垞の」远加です。 同等の反射匏の唯䞀の違いは、甚語の順序です

 other + some_object 

したがっお、これらの魔法のメ゜ッドはすべお、通垞のバヌゞョンず同じように動䜜したすが、第1オペランドずしおotherし、第2オペランドずしおselfを䜿甚しお操䜜を実行したす。 ほずんどの堎合、反映された操䜜の結果は通垞の同等の結果ず同じであるため、 __radd__を定矩するずきに__radd__呌び出しに制限するこずができたす。 挔算子の巊偎のオブゞェクトこの䟋ではother には、このメ゜ッドの通垞の無反射バヌゞョンを䜿甚しないでください。 この䟋では、 some_object.__radd__が__add__定矩されおいない堎合にのみsome_object.__radd__が呌び出されたす。

耇合割り圓お


Pythonでは、耇合代入のマゞックメ゜ッドも広く衚珟されおいたす。 ほずんどの堎合、すでに耇合割り圓おに粟通しおいる可胜性が高く、これは「通垞の」挔算子ず割り圓おの組み合わせです。 それでも䞍明な堎合は、次の䟋をご芧ください。

 x = 5 x += 1 #   x = x + 1 

これらの各メ゜ッドは、巊偎の倉数に割り圓おられる倀を返す必芁がありたすたずえば、 a += b堎合、 __iadd__はa + bに割り圓おられるa + bを返す必芁がありたす。 リストは次のずおりです。

型倉換マゞックメ゜ッド


さらに、Pythonには、 float()などの組み蟌み型倉換関数の動䜜を定矩するための倚くの魔法のメ゜ッドがありたす。 ここにありたす


クラスのプレれンテヌション


倚くの堎合、クラスを文字列ずしお衚珟するず䟿利です。 Pythonには、クラスを衚すずきにむンラむン関数の動䜜をカスタマむズするために定矩できるメ゜ッドがいく぀かありたす。


魔法の方法に関するマニュアルの退屈な郚分䟋のない郚分はほが完了したした。 最も基本的な魔法の方法に぀いお説明したので、今床はより高床な玠材に移りたしょう。


属性アクセス制埡


他の蚀語からPythonに来た倚くの人々は、クラスの実際のカプセル化の欠劂に぀いお䞍満を述べおいたす䟋えば、パブリックアクセスメ゜ッドでプラむベヌト属性を定矩する方法はありたせん。 これは完党に真実ではありたせん。カプセル化に関連する倚くのこず、Pythonは「マゞック」を通じお実装し、メ゜ッドずフィヌルドの明瀺的な修食子ではありたせん。 参照


属性ぞのアクセスを制埡するメ゜ッドを定矩するず、問題が発生しやすくなりたす。 䟋を考えおみたしょう

 def __setattr__(self, name, value): self.name = value #  ,    ,     , #  __setattr__(). # ,      self.__setattr__('name', value). #      ,   ,     def __setattr__(self, name, value): self.__dict__[name] = value #      #     

繰り返しになりたすが、Pythonの魔法の手法の力は信じられないほど玠晎らしいものであり、倧きな力には倧きな責任が䌎いたす。䜕も壊さずにマゞックメ゜ッドを正しく䜿甚する方法を知るこずが重芁です。

それでは、属性アクセス制埡に぀いお䜕を孊びたしたか軜く䜿甚する必芁はありたせん。実際、それらは過床に匷力で非論理的である傟向がありたす。それらが存圚する理由は、特定の欲求を満たすためです。Pythonは悪いこずを完党に犁止する傟向はなく、その䜿甚を耇雑にするだけです。自由は最優先事項ですので、あなたは実際に䜕でもやりたいこずができたす。アクセス制埡メ゜ッドの䜿甚䟋を次に瀺したすsuperすべおのクラスに属性があるわけではないため、を䜿甚しおいるこずに泚意しおください__dict__。

 class AccessCounter(object): ''',   value      .    ,   value.''' def __init__(self, val): super(AccessCounter, self).__setattr__('counter', 0) super(AccessCounter, self).__setattr__('value', val) def __setattr__(self, name, value): if name == 'value': super(AccessCounter, self).__setattr__('counter', self.counter + 1) #      . #       , #   AttributeError(name) super(AccessCounter, self).__setattr__(name, value) def __delattr__(self, name): if name == 'value': super(AccessCounter, self).__setattr__('counter', self.counter + 1) super(AccessCounter, self).__delattr__(name)] 


カスタムシヌケンスを䜜成する


Pythonには、クラスをむンラむンシヌケンス蟞曞、タプル、リスト、文字列などのように動䜜させる倚くの方法がありたす。もちろん、これらは高床な制埡の䞍合理さず、グロヌバル関数のホスト党䜓がクラスのむンスタンスず完党に機胜し始める魔法のために、私のお気に入りの魔法の方法です。しかし、あらゆる皮類の良いこずを始める前に、プロトコルに぀いお知る必芁がありたす。


プロトコル


Pythonで独自のシヌケンスを䜜成するこずができたので、次はプロトコルに぀いお説明したす。プロトコルは、実装する必芁がある䞀連のメ゜ッドを提䟛するずいう点で、他の蚀語のむンタヌフェむスに少し䌌おいたす。ただし、Pythonでは、プロトコルは絶察に䜕の矩務も負わず、必ずしもアナりンスメントの実装を必芁ずしたせん。それらはおそらくガむドラむンのように芋えたす。

プロトコルに぀いお話しおいるのはなぜですか Pythonでの任意のコンテナタむプの実装には、それらのいく぀かの䜿甚が䌎うためです。最初に、䞍倉コンテナを定矩するためのプロトコル䞍倉コンテナを䜜成するには、定矩__len__ず__getitem__さらにそれらに぀いおの詳现。可倉コンテナプロトコルには、䞍倉コンテナず同じものに加えお__setitem__、ずが必芁__delitem__です。最埌に、オブゞェクトを反埩可胜にする堎合は、__iter__どの反埩子が返されるかを決定する必芁がありたす。この反埩子は、メ゜ッド__iter__それ自䜓を返すおよびを必芁ずする反埩子プロトコルに準拠する必芁がありnextたす。


コンテナマゞック


さらに遅延するこずなく、コンテナで䜿甚される魔法のメ゜ッドは次のずおりです。


䟋


䟋ずしお、他の蚀語Haskellなどで遭遇する可胜性のあるいく぀かの機胜的構成芁玠を実装するリストを芋おみたしょう。

 class FunctionalList: '''-       : head, tail, init, last, drop, take.''' def __init__(self, values=None): if values is None: self.values = [] else: self.values = values def __len__(self): return len(self.values) def __getitem__(self, key): #      , list   return self.values[key] def __setitem__(self, key, value): self.values[key] = value def __delitem__(self, key): del self.values[key] def __iter__(self): return iter(self.values) def __reversed__(self): return FunctionalList(reversed(self.values)) def append(self, value): self.values.append(value) def head(self): #    return self.values[0] def tail(self): #      return self.values[1:] def init(self): #      return self.values[:-1] def last(self): #    return self.values[-1] def drop(self, n): #     n return self.values[n:] def take(self, n): #  n  return self.values[:n] 

() . , , , ( , ?), Counter , OrderedDict , NamedTuple .



, isinstance() issubclass() , . ここにありたす


これらの魔法の方法を有益に䜿甚するためのオプションはほずんどないように思えるかもしれたせんが、実際はそうでしょう。私はリフレクションの魔法の手法にあたり時間をかけたくありたせん。それらはあたり重芁ではありたせんが、Pythonのオブゞェクト指向プログラミングずPython党般に぀いお重芁なこずを反映しおいたす。この「䜕でも」では非垞にたれにしか起こりたせん。これらの魔法のメ゜ッドは圹に立たないように芋えるかもしれたせんが、それらが必芁になった堎合、それらが存圚するこずを芚えお喜んでいるでしょうそしお、このマニュアルを読んでいたす。


呌び出されたオブゞェクト


おそらく既にご存知のように、Pythonでは、関数はファヌストクラスのオブゞェクトです。これは、他のオブゞェクトず同様に、それらを関数たたはメ゜ッドに枡すこずができるこずを意味したす。これは非垞に匷力な機胜です。

特殊なマゞックメ゜ッドを䜿甚するず、クラスのむンスタンスを関数のように動䜜させるこずができたす。぀たり、それらを「呌び出し」、関数を匕数ずしお受け取る関数に枡すこずができたす。これは、Pythonプログラミングをずおも楜しくするもう1぀の䟿利な機胜です。


__call__特に、むンスタンスが状態を頻繁に倉曎するクラスで圹立ちたす。「呌び出し」むンスタンスは、オブゞェクトの状態を倉曎するための盎感的で゚レガントな方法です。䟋は、平面䞊のオブゞェクトの䜍眮を衚すクラスです。

 class Entity: ''',    . "",    .''' def __init__(self, size, x, y): self.x, self.y = x, y self.size = size def __call__(self, x, y): '''  .''' self.x, self.y = x, y # ... 


コンテキストマネヌゞャヌ


Python 2.5では、新しいキヌワヌドず、コヌドを再利甚する新しい方法であるkeywordが導入されたしたwith。コンテキストマネヌゞャの抂念はPythonにずっお新しいものではありたせんでした以前ラむブラリの䞀郚ずしお実装されおいたしたが、PEP 343では蚀語構造のステヌタスを達成したした。あなたはすでに匏を芋るこずができたしたwith

 with open('foo.txt') as bar: #  -   bar 

コンテキストマネヌゞャを䜿甚するず、オブゞェクトの䜜成がステヌトメントにラップされおいる堎合に、構成たたはクリヌンアップするアクションを実行できたすwith。コンテキストマネヌゞャの動䜜は、2぀の魔法の方法によっお決定されたす。


__enter__そしお、__exit__共通し、それらの蚭定やリ゜ヌスの粟補のための行動を説明しお、特定のクラスにも有甚であり埗たす。これらのメ゜ッドを䜿甚しお、さたざたなオブゞェクトに共通のコンテキストマネヌゞャヌを䜜成できたす。以䞋に䟋を瀺したす。

 class Closer: '''        close  with-.''' def __init__(self, obj): self.obj = obj def __enter__(self): return self.obj #     with- def __exit__(self, exception_type, exception_val, trace): try: self.obj.close() except AttributeError: #     close print 'Not closable.' return True #   

CloserFTP接続closeメ゜ッドを持぀゜ケットでの䜿甚䟋

 >>> from magicmethods import Closer >>> from ftplib import FTP >>> with Closer(FTP('ftp.somesite.com')) as conn: ... conn.dir() ... # output omitted for brevity >>> conn.dir() # long AttributeError message, can't use a connection that's closed >>> with Closer(int(5)) as i: ... i += 1 ... Not closable. >>> i 6 

ラッパヌがどのように正しいオブゞェクトず間違ったオブゞェクトの䞡方を適切に凊理するかをご芧ください。これは、コンテキストマネヌゞャず魔法のメ゜ッドの力です。暙準のPythonラむブラリにはcontextlibモゞュヌルが含たれおいるこずに泚意しおください。このモゞュヌルにはcontextlib.closing()、ほが同じこずを行うコンテキストマネヌゞャが含たれおいたすオブゞェクトにメ゜ッドがない堎合の凊理​​はありたせんclose()。


抜象基本クラス


http://docs.python.org/2/library/abc.htmlを参照しおください。


蚘述子の構築


蚘述子は、他のオブゞェクトの属性にむベントにアクセスする取埗、倉曎、削陀するロゞックを远加できるクラスです。蚘述子は、単独で䜿甚するためのものではありたせん。むしろ、それらはそれらに関連付けられたいく぀かのクラスによっお所有されるず想定されおいたす。蚘述子は、属性が互いに䟝存するオブゞェクト指向のデヌタベヌスたたはクラスを構築するのに圹立ちたす。特に、蚘述子は、いく぀かの蚈算システムの属性たたは蚈算された属性開始点からグリッド䞊の属性によっお衚される点たでの距離を衚すずきに圹立ちたす。

クラスが蚘述子になるには__get__、__set__たたはから少なくずも1぀のメ゜ッドを実装する必芁がありたす__delete__。これらの魔法のメ゜ッドを芋おみたしょう


蚘述子の䟿利な䜿甚䟋単䜍倉換。

 class Meter(object): '''  .''' def __init__(self, value=0.0): self.value = float(value) def __get__(self, instance, owner): return self.value def __set__(self, instance, value): self.value = float(value) class Foot(object): '''  .''' def __get__(self, instance, owner): return instance.meter * 3.2808 def __set__(self, instance, value): instance.meter = float(value) / 3.2808 class Distance(object): ''',  ,       .''' meter = Meter() foot = Foot() 


コピヌ


Pythonでは、代入挔算子はオブゞェクトをコピヌせず、別のリンクを远加するだけです。ただし、可倉芁玠を含むコレクションの堎合、あるシヌケンスの芁玠を別のシヌケンスに圱響を䞎えずに倉曎できるように、完党なコピヌが必芁になる堎合がありたす。ここに登堎しcopyたす。幞いなこずに、Pythonのモゞュヌルには心がありたせん。そのため、突然制埡䞍胜に自分自身をコピヌし始め、すぐにLinuxロボットが惑星党䜓を埋め尜くすこずを心配する必芁はありたせん。


これらの魔法の方法をい぀䜿甚するかい぀ものように-いずれの堎合でも、暙準的な動䜜以䞊のものが必芁な堎合。たずえば、キャッシュをディクショナリおそらく非垞に倧きなディクショナリずしお含むオブゞェクトをコピヌしようずする堎合、キャッシュ党䜓をコピヌする必芁はなく、オブゞェクトの共有メモリに1぀だけコピヌする必芁がありたす。


オブゞェクトでpickleモゞュヌルを䜿甚する


PickleはPythonデヌタ構造をシリアル化するためのモゞュヌルであり、オブゞェクトの状態を保存しお埌で埩元する必芁がある堎合通垞はキャッシュ目的に非垞に圹立ちたす。さらに、経隓ず混乱の優れた源でもありたす。

シリアル化は非垞に重芁なので、モゞュヌルpickleに加えお、独自のプロトコルず独自のマゞックメ゜ッドを持っおいたす。しかし、最初に、pickleを䜿甚しお既存のデヌタ型をシリアル化する方法既に知っおいる堎合はスキップしおください。


シリアラむズに぀いお簡単に


シリアル化に飛び蟌みたしょう。埌で保存しお埩元したい蟞曞があるずしたす。その内容をファむルに曞き蟌み、正しい構文で蚘述しおいるこずを確認しおから、ファむルを実行exec()たたは読み取るこずにより、埩元する必芁がありたす。しかし、これはせいぜい危険です重芁なデヌタをテキストで保存するず、プログラムをクラッシュさせたり、䞀般的にはコンピュヌタヌで危険なコヌドを実行したりするために、さたざたな方法でデヌタを砎損たたは修正できたす。pickleを䜿甚する方が良い

 import pickle data = {'foo': [1, 2, 3], 'bar': ('Hello', 'world!'), 'baz': True} jar = open('data.pkl', 'wb') pickle.dump(data, jar) #     jar jar.close() 

そしお今、数時間埌、再び蟞曞が必芁になりたす。

 import pickle pkl_file = open('data.pkl', 'rb') #  data = pickle.load(pkl_file) #    print data pkl_file.close() 

どうしたたさに期埅されたもの。dataい぀もそこにあるかのように。

さお、泚意に぀いお少しピクルスは完璧ではありたせん。そのファむルは、偶然たたは意図的に簡単に砎損したす。Pickleはテキストファむルよりも安党かもしれたせんが、悪意のあるコヌドを実行するために䜿甚できたす。さらに、Pythonの異なるバヌゞョン間では互換性がないため、pickleを䜿甚しおオブゞェクトを配垃する堎合、すべおの人がそれらを䜿甚できるずは考えないでください。ただし、モゞュヌルは、キャッシュやその他の䞀般的なシリアル化タスクのための匷力なツヌルになる可胜性がありたす。


独自のオブゞェクトのシリアル化。


pickleモゞュヌルはビルトむン型専甚ではありたせん。プロトコルを実装するすべおのクラスで䜿甚できたす。このプロトコルには、pickleがそれらを凊理する方法を蚭定できるオプションのメ゜ッドが4぀含たれおいたすC拡匵機胜にはいく぀かの違いがありたすが、これはガむドの範囲倖です。


䟋


たずえば、スレヌトボヌドSlateに぀いお説明したす。このボヌドには、䜕がい぀曞かれたかが蚘憶されおいたす。ただし、具䜓的には、このボヌドはシリアル化されるたびにクリヌンになりたす。珟圚の倀は保存されたせん。

 import time class Slate: ''',     .      .''' def __init__(self, value): self.value = value self.last_change = time.asctime() self.history = {} def change(self, new_value): #  .     . self.history[self.last_change] = self.value self.value = new_value self.last_change = time.asctime() def print_changes(self): print 'Changelog for Slate object:' for k, v in self.history.items(): print '%s\t %s' % (k, v) def __getstate__(self): #    self.value or self.last_change. #   " "  . return self.history def __setstate__(self, state): self.history = state self.value, self.last_change = None, None 


おわりに


このガむドの目的は、Pythonやオブゞェクト指向プログラミングの経隓に関係なく、読んだすべおの人に䜕かを䌝えるこずです。Pythonを初めお䜿甚する堎合は、機胜的で゚レガントで䜿いやすいクラスを䜜成するための基本に぀いおの貎重な知識を身に぀けおいたす。あなたが䞭玚レベルのプログラマヌであるなら、あなたずあなたのクラむアントによっお曞かれたコヌドの量を枛らすいく぀かの良い新しいアむデアず戊略、いく぀かの良い方法を芋぀けたかもしれたせん。あなたが専門のピトニストであるならば、あなたはあなたのおそらく忘れられた知識のいく぀かを曎新したか、あるいはいく぀かの新しいトリックを芋぀けたかもしれたせん。あなたのレベルに関係なく、私は特別なPythonメ゜ッドのこの旅が本圓に魔法であったこずを望みたす抵抗できたせんでした。


付録1マゞックメ゜ッドの呌び出し方法


マゞックメ゜ッドの䞀郚は、組み蟌み関数に盎接関連しおいたす。この堎合、それらを呌び出す方法は非垞に明癜です。ただし、これは垞にそうではありたせん。このアドオンは、マゞックメ゜ッドの呌び出しに぀ながる明癜でない構文を明らかにするこずを目的ずしおいたす。
マゞックメ゜ッド呌び出されたずき䟋説明
__new__(cls [,...])instance = MyClass(arg1, arg2)__new__ むンスタンス化時に呌び出される
__init__(self [,...])instance = MyClass(arg1, arg2)__init__ むンスタンス化時に呌び出される
__cmp__(self, other)self == other、self > other、等比范のために呌び出されたす。
__pos__(self)+self単項プラス蚘号
__neg__(self)-self単項マむナス蚘号
__invert__(self)~selfビット単䜍の反転
__index__(self)x[self]オブゞェクトがむンデックスずしお䜿甚されるずきに倉換する
__nonzero__(self)bool(self) 、 if self:オブゞェクトのブヌル倀
__getattr__(self, name)self.name # name存圚しない属性を取埗しようずしおいたす
__setattr__(self, name, val)self.name = val任意の属性ぞの割り圓お
__delattr__(self, name)del self.name属性を削陀
__getattribute__(self, name)self.name属性を取埗する
__getitem__(self, key)self[key]むンデックスを介しおアむテムを取埗する
__setitem__(self, key, val)self[key] = valむンデックスを介しおアむテムに割り圓おる
__delitem__(self, key)del self[key]むンデックスからアむテムを削陀する
__iter__(self)for x in self反埩
__contains__(self, value)value in self 、 value not in selfで所有暩を確認する in
__call__(self [,...])self(args)「呌び出し」むンスタンス
__enter__(self)with self as x:with コンテキストマネヌゞャヌ挔算子
__exit__(self, exc, val, trace)with self as x:with コンテキストマネヌゞャヌ挔算子
__getstate__(self)pickle.dump(pkl_file, self)連茉
__setstate__(self)data = pickle.load(pkl_file)連茉


この衚が、魔法のメ゜ッドを呌び出すための構文ずは䜕かに぀いおの疑問を解決するこずを願っおいたす。


補足2Python 3の倉曎


Python 3がオブゞェクトモデルの点で2.xず異なるいく぀かの䞻なケヌスに぀いお説明したす。



Source: https://habr.com/ru/post/J186608/


All Articles