ホームページ >バックエンド開発 >Python チュートリアル >Python 演算子のオーバーロード例のコード共有の詳細な説明

Python 演算子のオーバーロード例のコード共有の詳細な説明

高洛峰
高洛峰オリジナル
2017-03-10 09:07:101303ブラウズ

この記事は主にPython演算子のオーバーロードサンプルコード共有の詳細な説明の関連情報を紹介します

Python演算子のオーバーロード

Python言語は言語の柔軟性を高める演算子オーバーロード機能を提供します。 C++ とは似ていますが、少し異なります。その特殊な性質を考慮して、今日は Python 演算子のオーバーロードについて説明します。

Python 言語自体は多くのマジック メソッドを提供しており、演算子のオーバーロードはこれらの Python 組み込みマジック メソッドを書き換えることで実現されます。これらのマジック メソッドはすべて、__X__ の形式と同様に、二重アンダースコアで始まり、終わります。Python は、この特別な命名メソッドを通じて演算子をインターセプトしてオーバーロードを実現します。 Python の組み込み操作がクラス オブジェクトに適用されると、Python はオブジェクト内で指定されたメソッドを検索して呼び出し、操作を完了します。

クラスは、加算と減算、印刷、関数呼び出し、インデックス作成などの組み込み演算をオーバーロードできます。演算子のオーバーロードにより、オブジェクトは組み込みオブジェクトと同じように動作します。 Python は、演算子を呼び出すときにこのようなメソッドを自動的に呼び出します。たとえば、クラスが __add__ メソッドを実装している場合、クラスのオブジェクトが + 演算子に出現すると、このメソッドが呼び出されます。

一般的な演算子オーバーロードメソッド


加減算__call____getattr__インデックスとシャードの削除 del __bool__ブールテスト__lt__, __gt__, __eq__、__ne__ X==Y、等しい、ge: より大きい、)__radd__右側の加算other+X__iadd__フィールド(拡張)加算__が含まれます__メンバーシップテスト項目 hex(X), bin (X), oct (

メソッド名

オーバーロードの説明

演算子呼び出しメソッド

__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__

bool(X)

__le__, __ge__,

具体的な比較

順に XY、X=Y、

eq: 等しい、ne: 等しくない

__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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。