そろそろ文法の勉強が必要と感じたので備忘録的に書く.
クラスとは
オブジェクト指向プログラミング (object-oriented programming) の特徴の一つであるクラス (class) は、オブジェクト (object) を生成するための設計図にあたるものです。 まず、クラスとは何か、オブジェクトとは何かについて説明します。(chainerチュートリアル)
個人的な解釈としては,構造体を作るための設計図.
class house:
def __init__(self,name,size,price,zei):
self.name_plate = name
self.size = size
self.price = price
self.zei = zei
def whose(self):
name = self.name_plate
print("{}の家です".format(name))
def mate(self,mate):
name = self.name_plate
print("{}と{}の家です".format(name,mate))
def price(self):
print("お値段は{0}".format(self.price))
def cost(self):
total = self.price * self.zei
print("お値段は{0}".format(total))
こんなのを考える.
質問タイム
1.なんで全て引数にselfをとるのか.
->前提として,クラスではなく作成されたインスタンスがこの関数を実行する.そのとき,関数に必要なデータはインスタンス自身が持っており,これを参照するから.
->具体的な例として,self構造体のなかのname_plate構造にnameが入っているから.
->classのなかで変数は共有されるわけではない.あくまで共有されるのはselfによって定義された自分自身(構造体)だけ.(共有という言葉も違うけれど)
2.引数はselfだけなのか.
->そんなことはない.mateを追加したぞ.
->だけれども,その引数のある関数でしか使えない.同じクラスだから~なんて融通はきかない.
3.毎回.()を書くのがだるい.
initしたものに限っては()なしでコールできるぞ.
() を付けないとオブジェクト(値)となる.メソッドならメソッドオブジェクト.()をつけるのは関数呼び出してあって,値の呼び出しではない.
(8/2細く,shiracamusさん)
4.これ何->{}
->フォーマット出力っていうらしい.
->""でくくっても''でくくっても問題ない便利な代物.ちなみに{0}で順番を指定して出せるっぽい.
みてみよう
my_house = house("joil",12,323432123)
my_house.mate("shin")
->joilとshinの家です
my_house.whose()
->joilの家です
my_house.sise()
->323432135
ほら動いた.
継承
まんま.
あるクラスを定義したら、その一部の機能を変更したり、新しい機能を付け足したりしたくなることがあります。 これを実現する機能が継承 (inheritance) です。(chainerチュートリアル)
class Link:
def __init__(self):
self.a = 1
self.b = 2
class Chain(Link):
def __init__(self):
super().__init__()
self.d = 114514
def sum_before(self):
return self.a + self.b
def sum(self):
self.a = 3
return self.a + self.b
def sum_after(self):
return self.a + self.b
class rope(Chain):
def __init__(self):
super().__init__()
self.c = 1919810
悩みながらやった結果を残すのもあほらしいから最初から結果を出す.
まず,継承の雰囲気だけれども丸呑みである.だからinitしなければ,呑んだものをそのまま参照することができる.しかし,initすると呑んだものが完全に消化されてしまう.つまり構造体に何かをくっつけることはできないのだ.ただ,それでは不便すぎるのでinitしたくなる.その時のためにあるのがsuper.
すごい強そう.何ができるかというと,まず普通にinitする.そのときにこれを呼び出すと,丸呑みにしたクラスのinitを参照して回ってくれる.みたほうが早い.
c = rope
c.a
->1
c.c
->1919810
すっげ.ちなみにこれinitしたところでsuper()すればいいから,Chainのsuperはなくても良い.(もしChainでのsuperをなくして self.d = 114514 するとエラーが出る)
質問タイム
1.名前被ったらアウトだよね
上流まで遡るから多分アウト.下流の値で上書きされるはず.
To Do
結果を新しく保存(定義することはできるの?)
->できないくさい.
->結局,クラスは何らかの初期値をとって,そのデータに対して".関数名"でいじれるようにするだけ.
メンバやメソッドなら増やしたり消したりできる.(8/2訂正,shiracamusさん)
また,事前に宣言しておけば後から追加(定義)して取り込む(登録)することができる.