この記事は主にPython演算子のオーバーロードサンプルコード共有の詳細な説明の関連情報を紹介します
Python演算子のオーバーロード
Python言語は言語の柔軟性を高める演算子オーバーロード機能を提供します。 C++ とは似ていますが、少し異なります。その特殊な性質を考慮して、今日は Python 演算子のオーバーロードについて説明します。
Python 言語自体は多くのマジック メソッドを提供しており、演算子のオーバーロードはこれらの Python 組み込みマジック メソッドを書き換えることで実現されます。これらのマジック メソッドはすべて、__X__ の形式と同様に、二重アンダースコアで始まり、終わります。Python は、この特別な命名メソッドを通じて演算子をインターセプトしてオーバーロードを実現します。 Python の組み込み操作がクラス オブジェクトに適用されると、Python はオブジェクト内で指定されたメソッドを検索して呼び出し、操作を完了します。
クラスは、加算と減算、印刷、関数呼び出し、インデックス作成などの組み込み演算をオーバーロードできます。演算子のオーバーロードにより、オブジェクトは組み込みオブジェクトと同じように動作します。 Python は、演算子を呼び出すときにこのようなメソッドを自動的に呼び出します。たとえば、クラスが __add__ メソッドを実装している場合、クラスのオブジェクトが + 演算子に出現すると、このメソッドが呼び出されます。
一般的な演算子オーバーロードメソッド
メソッド名 |
オーバーロードの説明 |
演算子呼び出しメソッド |
__init__ |
コンストラクター | オブジェクト作成: |
X+Y, X+=Y/X-Y, pr__/ __Str__ 印刷/変換 | Print (x), REPR (X) / Str (x) |
|
関数 | X (*ARGS, ** kwargs) | |
属性参照 |
|
X.any=値 |
__delattr__ | 属性の削除 | del |
__getitem__ | インデックス操作 | X[ key]、 __delitem__ |
del |
| __bool__ブールテスト |
bool(X) |
__lt__, __gt__, |
__le__, __ge__, | __eq__、__ne__
具体的な比較 |
順に X | X==Y、等しい、ge: より大きい、eq: 等しい、ne: 等しくない | )
__radd__ | 右側の加算 | other+X |
| __iadd__
| フィールド(拡張)加算|
__が含まれます__ |
| メンバーシップテスト項目 |
__delete__ |
記述子属性 |
X.attr, X.attr=value, del 以下は、一般的に使用される演算子メソッドの使用方法の紹介です。 コンストラクターとデストラクター: __init__ と __del__ それらの主な機能は、オブジェクトの作成とリサイクルです。インスタンスが作成されると、__init__ 構築メソッドが呼び出されます。インスタンス オブジェクトが再利用されると、デストラクター __del__ が自動的に実行されます。 >>> class Human(): ... def __init__(self, n): ... self.name = n ... print("__init__ ",self.name) ... def __del__(self): ... print("__del__") ... >>> h = Human('Tim') __init__ Tim >>> h = 'a' __del__ ログイン後にコピー 加算演算と減算演算: __add__ と __sub__ これら 2 つのメソッドをオーバーロードすると、通常のオブジェクトに + 演算子演算を追加できます。次のコードは、+- 演算子を使用する方法を示しています。__sub__ メソッドがコードから削除されてからマイナス演算子が呼び出される場合、エラーが発生します。 >>> class Computation(): ... def __init__(self,value): ... self.value = value ... def __add__(self,other): ... return self.value + other ... def __sub__(self,other): ... return self.value - other ... >>> c = Computation(5) >>> c + 5 10 >>> c - 3 2 ログイン後にコピー オブジェクトの文字列式: __repr__ と __str__ これら 2 つのメソッドは、オブジェクトの文字列式を表すために使用されます: print()、str() メソッドは、__str__ メソッドがが呼び出されると、print()、str()、および repr() メソッドが __repr__ メソッドを呼び出します。次の例からわかるように、2 つのメソッドが同時に定義されている場合、Python は最初に __str__ メソッドを検索して呼び出します。 >>> class Str(object): ... def __str__(self): ... return "__str__ called" ... def __repr__(self): ... return "__repr__ called" ... >>> s = Str() >>> print(s) __str__ called >>> repr(s) '__repr__ called' >>> str(s) '__str__ called' ログイン後にコピー インデックス値の取得と代入:__getitem__、__setitem__ この2つのメソッドを実装することで、X[i]の形でオブジェクトにアクセスして代入したり、オブジェクトを利用したりすることができますスライス操作。 >>> class Indexer: data = [1,2,3,4,5,6] def __getitem__(self,index): return self.data[index] def __setitem__(self,k,v): self.data[k] = v print(self.data) >>> i = Indexer() >>> i[0] 1 >>> i[1:4] [2, 3, 4] >>> i[0]=10 [10, 2, 3, 4, 5, 6] ログイン後にコピー 属性の設定とアクセス: __getattr__、__setattr__ __getattr__ と __setattr__ をオーバーロードすることで、オブジェクト メンバーへのアクセスをインターセプトできます。 __getattr__ は、オブジェクトに存在しないメンバーにアクセスするときに自動的に呼び出されます。 __setattr__ メソッドは、オブジェクトのメンバーを初期化するときに呼び出すために使用されます。つまり、__dict__ の項目を設定するときに __setattr__ メソッドが呼び出されます。具体的な例は次のとおりです。 class A(): def __init__(self,ax,bx): self.a = ax self.b = bx def f(self): print (self.__dict__) def __getattr__(self,name): print ("__getattr__") def __setattr__(self,name,value): print ("__setattr__") self.__dict__[name] = value a = A(1,2) a.f() a.x a.x = 3 a.f() ログイン後にコピー 上記のコードの実行結果は次のとおりです。この結果から、存在しない変数 x にアクセスするときに __getattr__ メソッドが呼び出されることがわかります。 __init__ が呼び出されると、代入操作の __setattr__ メソッドも呼び出されます。 __setattr__ __setattr__ {'a': 1, 'b': 2} __getattr__ __setattr__ {'a': 1, 'x': 3, 'b': 2} ログイン後にコピー Iterator オブジェクト: __iter__、__next__ Python の反復は、__getitem__ メソッドをオーバーロードすることで直接実装できます。以下の例を参照してください。 >>> class Indexer: ... data = [1,2,3,4,5,6] ... def __getitem__(self,index): ... return self.data[index] ... >>> x = Indexer() >>> for item in x: ... print(item) ... 1 2 3 4 5 6 ログイン後にコピー 上記の方法で繰り返しを実行できますが、それは最良の方法ではありません。 Python の反復操作では、まず __iter__ メソッドの呼び出しが試行され、次に __getitem__ が試行されます。反復環境は、iter を使用して、反復子オブジェクトを返す __iter__ メソッドの検索を試みることによって実装されます。このメソッドが提供されている場合、Python は StopIteration 例外が発生するまで反復子オブジェクトの next() メソッドを繰り返し呼び出します。 __iter__ が見つからない場合、Python は __getitem__ メカニズムを使用しようとします。イテレータの例を見てみましょう。 class Next(object): def __init__(self, data=1): self.data = data def __iter__(self): return self def __next__(self): print("__next__ called") if self.data > 5: raise StopIteration else: self.data += 1 return self.data for i in Next(3): print(i) print("-----------") n = Next(3) i = iter(n) while True: try: print(next(i)) except Exception as e: break ログイン後にコピー プログラムの実行結果は次のとおりです: __next__ called 4 __next__ called 5 __next__ called 6 __next__ called ----------- __next__ called 4 __next__ called 5 __next__ called 6 __next__ called ログイン後にコピー __iter__ メソッドと __next__ メソッドを実装した後、オブジェクトを for in まで反復処理できることがわかります。 iter() メソッドと next() メソッドを使用してオブジェクトを反復処理できます。 読んでいただきありがとうございます、皆さんのお役に立てれば幸いです、このサイトをサポートしていただきありがとうございます! |
以上がPython 演算子のオーバーロード例のコード共有の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。