Python 演算子のオーバーロードのコード チュートリアル

Y2J
リリース: 2017-05-15 11:34:25
オリジナル
1742 人が閲覧しました

この記事は主にPython演算子のオーバーロードに関する関連情報とサンプルコードを紹介します

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

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

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

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

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

加減算print(X), repr(X)/str(X)cX .unknownX.any =valuedelattrattribute delX。 anyX[インデックスとシャードの削除Length 具体的な比較反復を含むメンバーシップテストindexintegervaluehex(X), bin(X), bin(X),出口環境マネージャー with obj as var:get、set、X .attr, X.attr=値, del X .attr

メソッド名

オーバーロード命令

メソッド呼び出し演算子

init

コンストラクター

オブジェクトの作成:

X+Y, X+=Y/X-Y, _repr /str

印刷/変換

all

関数呼び出し

X (* args, **kwargs)

getattr

属性
参照

setattr

属性の割り当て

削除

getitem

インデックス操作

key

],

X[key],X[i :j]=sequence

delアイテム

del

len (

le, ge,
eq, ne

はX
le: より小さい、ge: より大きい、

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

radd

右側追加

other +

next

I=iter(X), next()

X のアイテム ( X は任意の反復可能なオブジェクトです)

delete

new

Create

initの前にオブジェクトを作成する

以下は、一般的に使用される演算子メソッドの使用方法の概要です。


コンストラクターとデストラクター: init と del

それらの主な機能は、オブジェクトの作成とリサイクルです。インスタンスが作成されると、init コンストラクター メソッド

が呼び出されます。インスタンス オブジェクトが再利用されると、デストラクター 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
ログイン後にコピー

オブジェクトの

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 メソッドも呼び出されます。

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 メソッドを検索することによって実装され、iter メソッドはイテレーター オブジェクトを返します。このメソッドが提供されると、Python は S

top

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート