この記事は主にPython演算子のオーバーロードに関する関連情報とサンプルコードを紹介します
Python演算子のオーバーロード
Python言語には演算子のオーバーロード機能があり、言語の柔軟性が多少向上します。 C++ とは似ていますが、多少異なります。その特殊な性質を考慮して、今日は Python 演算子のオーバーロードについて説明します。
Python 言語自体は多くのマジック メソッドを提供しており、演算子のオーバーロードはこれらの Python 組み込みマジック メソッドを書き換えることで実現されます。これらのマジック メソッドはすべて、X の形式と同様に、二重アンダースコアで始まり、終わります。Python は、この特別な命名メソッドを通じて operator をインターセプトし、オーバーロードを実現します。 Python の組み込み操作がクラス オブジェクト に適用されると、Python は を検索 し、オブジェクトで指定されたメソッドを呼び出して操作を完了します。
クラスは、加算と減算、印刷、function呼び出し、index などの組み込み演算をオーバーロードできます。演算子のオーバーロードにより、オブジェクトの 動作 が組み込みオブジェクトの動作と同じになります。 Python は、演算子を呼び出すときにこのようなメソッドを自動的に呼び出します。たとえば、クラスが add メソッドを実装している場合、クラスのオブジェクトが + 演算子に出現すると、このメソッドが呼び出されます。
一般的な演算子オーバーロードメソッド
メソッド名 |
オーバーロード命令 |
メソッド呼び出し演算子 |
init |
オブジェクトの作成: | 加減算|
X+Y, X+=Y/X-Y, _repr /str |
print(X), repr(X)/str(X) | |
all | 関数呼び出し |
X (* args, **kwargs) |
getattr |
属性 |
参照 |
setattr |
属性の割り当て |
|
delattr | attribute | 削除 |
X。 any | インデックス操作 |
|
key ], X[key],X[i :j]=sequence |
delアイテム | |
del | Lengthle, ge, | eq, ne |
はX le: より小さい、ge: より大きい、 eq: 等しい、ne: 等しくない |
)
|
|
radd | 右側追加 | other + |
I=iter(X), next() | を含む | メンバーシップテスト |
X のアイテム ( X は任意の反復可能なオブジェクトです) |
| index|
hex(X), bin(X), bin(X),出口 |
| 環境マネージャー
| with obj as var:
get、set、 | delete | X .attr, X.attr=値, del X .attr |
Create |
コンストラクターとデストラクター: init と del
が呼び出されます。インスタンス オブジェクトが再利用されると、デストラクター 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
これら 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オブジェクトの
string式形式: 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 メソッドは、オブジェクト メンバーを初期化するときに呼び出すために使用されます。つまり、setattr メソッドは、dict 項目を設定するときに呼び出されます。具体的な例は次のとおりです。
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()
上記のコードの実行結果は以下の通りです。この結果から、init が存在しない
変数x; にアクセスすると getattr メソッドが呼び出されることがわかります。呼び出された場合、代入操作によって setattr メソッドも呼び出されます。 setattr
setattr
{'a': 1, 'b': 2}
getattr
setattr
{'a': 1, 'x': 3, 'b': 2}
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
Iteration 例外が発生するまで反復子オブジェクトの 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() メソッド オブジェクトを反復処理します。 【関連推奨事項】
1.
特別な推奨事項: 「php Programmer Toolbox」V0.1 バージョンのダウンロード2.
Python の基本入門チュートリアル以上がPython 演算子のオーバーロードのコード チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。