Python.use(better) #OOP:文字列 -- 特殊メソッド

記事一覧 Python.use(better)《Python3.1》

OOP:文字列 -- 特殊メソッド

《著》真樹育未、小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第1版♪1988/05/23 ● 第2版♪2001/01/29 ● 第3版♪2009/12/15

オブジェクト指向プログラミング〔OOP〕の基本概念の理解を深めます。
※ Python1.5 で作成した例題を、Python3.1 で再構成しました。

コンテナー(コレクション)

任意のオブジェクトを保持するコンテナー(コレクション)として、

  • シーケンス〔sequence〕
  • マップ〔map〕

が挙げられます。

文字列

文字列は、他の(長さが1の)文字列を保持するコンテナーと見なせます。

演算子を利用するということ

演算子 + に呼応して、特殊メソッド __add__ が起動されます。

《note》演算子 + に呼応して、特殊メソッド __add__ が起動されるのは、次のようにして確認できます。

>>> class mystr(str):
...     def __add__(self, other):
...         print("__add__(self=%r, other=%r)"%(self, other))
...         print("self: %d, other: %d"%(id(self), id(other)))
...         return super().__add__(other)


>>> a = mystr("A"); b = "B"
>>> hex(id(a)); hex(id(b))
'0x12b7298'
'0x8d300'
>>> a+b
__add__(self='A', other='B')
self: 0x12b7298, other: 0x8d300
'AB'

>>> a = str("A"); b = "B"
>>> a+b
'AB'

これを見ると、メソッド呼び出しの「実引数」に指定したオブジェクトと、メソッドの本体で「仮引数」を介して参照されるオブジェクトとは、同一だと分かります。

関数オブジェクトは、関数呼び出しによって(引数を介して)他のオブジェクトと関連付けられ、リターン値(オブジェクト)を生成します。このとき、引数(変数と同様)によってオブジェクトは束縛されます。そして、メソッドの本体に記述したコードを実行した後で、引数による束縛は解かれます。

>>> s3 = a.__add__(b); s3; id(s3)
'AB'
20276256
>>> c0,c1 = s3; c0; id(c0); c1; id(c1)
'A'
1014432
'B'
1014464


オブジェクトの内部構造を捨象すると、その全体像が見えてきます。ここでは、

  • 変数 a,b によって束縛されるものと、
  • 引数によって束縛されるものとは、

同じ文字列オブジェクト 'A','B' です。関数呼び出し後に、引数による束縛は解かれますが、変数による束縛は維持されるので、引き続き同じ文字列オブジェクトを参照できます。

また、変数 s3 によって束縛されるリターン値(オブジェクト)は、関数呼び出し後も、引き続き同じ文字列オブジェクト 'AB' を参照できます。ここで、着目して欲しいのは、

  • 連結する前に用意した、変数 a,b によって束縛される文字列 'A','B' と、
  • 演算子 + によって連結された文字列 'AB' が、要素として保持する文字列 'A','B' とは、

別のオブジェクトになることです。と同時に、これらの要素は、変数 s1,s2 によって束縛される文字列 'AB' を構成するのと同じものです。

>>> id(str)
3331264
>>> id(str.__add__)
129064
>>> type(str.__add__)

》こちらに移動中です《
TOP


関連記事

Last updated♪2009/12/31