スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
.-- -- スポンサー広告 comment(-) trackback(-)

Pythonメモ書き:サブクラスの練習2

ほっほ~ですよ。

>>>class FirstClass:
...  def setdata(self, value):
...     self.setdata = value
...  def display(self):
...    print self.setdata

...
>>>x = FirstClass()
>>>y = FirstClass()
>>>x.setdata('mice')
>>>y.setdata('ADAR1')
>>>x.display()
mice
>>>y.display()
ADAR1
>>>
>>>class SecondClass(Firstclass):
...  def display(self):
...    print 'Current value is "%s"' % self.setdata

...
>>>z = SecondClass()
>>>z.setdata("human")
>>>z.display()
Current value is "human"
>>>
>>>class ThirdClass(SecondClass):
...  def __init__(self, value):
...    self.setdata = value
...  def __add__(self, other):
...    return ThirdClass(self.setdata + other)
...  def __mul__(self, other):
...    self.setdata = self.setdata*other

...
>>>a = ThirdClass("canine")
>>>a.display()
Current value is "canine"
>>>b = a + "bovine"
>>>b.display()
Current value is "caninebovine"
>>>a*3
>>>a.display()
Current value is "caninecaninecanine"

で、ここまでやって

色々試してみたくなり

>>>class FourthClass(SecondClass):
...  def __init__(self, value):
...    self.setdata = value
...
>>>m = FourthClass("Kuni")
>>>m.display()
Current value is "Kuni"
>>>n = m + "naga"
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'instance' and 'str'

ほっほー。
ThirdClassで+演算子がビルトインの+演算子として機能していたわけではないことを確認。

で、さらに

>>>x = ThirdClass("micky")
>>>y = ThirdClass("mouse")
>>>M = x + y
Traceback (most recent call last):
File "", line 1, in
File "", line 5, in __add__
TypeError: cannot concatenate 'str' and 'instance' objects
>>>
>>>M = x + " and minny"
>>>M.display()
current value is "micky and minny"
>>>

ほっほ~。

otherはinstanceじゃダメってことか。。。。な?
スポンサーサイト
.07 2010 Python:クラス comment0 trackback0

Pythonメモ書き:クラスでの演算子のオーバーロード

演算子のオーバーロードに関するポイント

演算子のオーバーロードには__X__というような名前のメソッドを使用する
その種のメソッドは、いずれも特定の演算に対応する。
インスタンスオブジェクトがどの演算に対応できるかは、クラスにどのメソッドを持たせるかで決まる。

__X__メソッドは、インスタンスオブジェクトが対応する演算に使われたときに自動的に呼び出される
例えば、__plus__メソッドは、インスタンスオブジェクトが+演算子を使用した式に使われた時に自動的に呼び出され、
メソッドの戻り値は、対応する式の実行結果。

クラスではビルトインオブジェクトに使用される演算子のほとんど全てをオーバーロードできる
式だけでなく、出力やオブジェクトの作成等の基本的な処理にも対応できる。

演算子のオーバーロード用のメソッドにはデフォルトはなく、全く使用しないことも可能

演算子のオーバーロードによりビルトインオブジェクトのようなオブジェクトが作れる
プログラムを構成するオブジェクトと、そのインタフェースの統一性、一貫性を高めることが出来る。

ここまで読ませといてなんですけど

実は演算子のオーバーロードは、一般向けにはあまり推奨しないって。。。

でも、よく見るよね、この__X__のメソッド。

で、ほとんどすべてのクラスに存在する__int__

コンストラクタと呼ばれ、オブジェクトの状態を初期化するのに使用される。

このメソッドと引数selfはPythonのプログラミングにおいて鍵となるようなので

次の練習で試してみます。
.07 2010 Python:クラス comment0 trackback0

Pythonメモ書き:サブクラスの練習1

では、さきほどのFirstClassを継承させてSecondClassを定義してみる。

>>>class FirstClass:
...  def a_data(self, value):
...    self.a_data = value
...  def output(self):
...    print self.a_data
...
>>>name = FirstClass()
>>>id = FirstClass()
>>>
>>>name.a_data('Hanako')
>>>id.a_data(800702)
>>>
>>>name.output()
Hanako
>>>id.output()
800702
>>>
>>>class SecondClass(FirstClass):
...  def output(self):
...    print 'your current value = "%s"' % self.a_data
...
>>>new_id = SecondClass()
>>>new_id.a_data(800418)
>>>new_id.output()
your current value = "800418"
>>>id.output()
800702

SecondClassでのメソッド.outputの変更がFirstClassに影響を与えていないことも

最後に確認してみました。
.07 2010 Python:クラス comment0 trackback0

Pythonメモ書き:サブクラス

サブクラスの作成、属性の継承等に関するポイント

サブクラスを作る際、classステートメントの見出しの行にスーパークラス名を列挙する
classステートメントの見出しの行のカッコの中に基になるクラス(スーパークラス)の名前を列挙する。
これで、列挙されたクラスの属性が継承される。

サブクラスはスーパークラスの属性を継承する
スーパークラスから継承した属性はいずれも、サブクラスの属性として扱える。
属性へのアクセスのためのコードが実行される際に、サブクラスだけでなく、サブクラスと同じオブジェクトツリー上のクラスがすべて自動的に検索される。

インスタンスは作成元になったクラスだけでなく、その上位にあるクラスからも全ての属性を継承する
属性へのアクセスの際、属性の検索はまずインスタンスで行われ、その後、下位のものから順にクラスが検索される。

<オブジェクト>.<属性>という式があれば、その都度逐一属性の検索が行われる
classステートメントの外では、「オブジェクト」の部分にインスタンスオブジェクト、あるいはクラスオブジェクトが代入された変数を指定する。

サブクラスで属性に変更を加えても、スーパークラスには影響しない
サブクラスを作れば、既存のコードをそのまま残してプログラムのカスタマイズが出来る。
.07 2010 Python:クラス comment0 trackback0

Pythonメモ書き: クラス練習1

とりあえず、やってみよう!!

>>>class FirstClass:
...  def a_data(self, value):
...    self.a_data = value
...  def output(self):
...    print self.a_data
...
>>>name = FirstClass()
>>>id = FirstClass()
>>>
>>>name.a_data('Hanako')
>>>id.a_data(800702)
>>>
>>>name.output()
Hanako
>>>id.output()
800702

なんでしょう。

やっていて、自分でメソッドを作ってる感じ。

ま、そういうことなんだけどね。
.07 2010 Python:クラス comment0 trackback0
 HOME 

プロフィール

emi

Author:emi
日々、コンピューターとにらめっこしていた2010。
公の仕事に就くことを目指して教科書とにらめっこ2011,spring。
はたして2012は・・・

最新トラックバック

検索フォーム

ブロとも申請フォーム

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。