こんにちは、かずまなぶです。
最近マイクロソフトのホロレンズを試す機会をいただきました。VRとARは似て非なるもの。VRが「没入型、隔離型」なら、ARは「現実にちょっとした情報を上乗せしていく」ような感じでした。
それぞれ特徴があり、またどちらもわたくしの好奇心を激しく揺さぶるデバイスです。ホロレンズ2が出るとの噂があり100%買ってしまいそうです。またオキュラスクエストも発売が近いのではないでしょうか。VRの本命はクエストだと思います。ミラージュは・・・・・、もういいかな・・・。余談はこれくらいにして・・・。
今日の本題です。クラスの作り方とそのメソドの作り方、クラスの継承、オーバーライドをやっていきます。
クラスの使い方 レベル1
まずは最も基本の形です。オブジェクト指向の感覚を養いましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#クラスの使い方:レベル1 メソドを作成 #クラスを作成する class Person(object):#pythonではobjectと()を書かなくても問題なく動くが、 #書いておいたほうがわかりやすい。 #クラスのメソドを作成する def say_word(self): print("hello world") #クラスからインスタンスを作成する kenji=Person() #メソドを使用してみる kenji.say_word() |
これを実行するとkenjiさんはsay_wordメソドで ” hello world ” と発言します。
クラスの使い方 レベル2
クラスを呼び出したときに勝手に実行される「初期化メソド」、クラスからつくったオブジェクトの変数である「アトリビュート」、おまけにメソドの中でもメソドをネストして使用することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#クラスの使い方:レベル2 初期化メソドを追加 # アトリビュートの追加 # メソドの中でメソドを追加 #クラスを作成する #初期化メソドを作成する(クラスを呼び出された時点で動作するメソド) def __init__(self,name="名無し"): #値を保持する場合はself.を使う self.name=name print("私の名前は",self.name,"です") #クラスのメソドを作成する1 def say_word(self): print("こんにちは{}です".format(self.name)) #メソドの中で他のメソドを使用する self.go_forward(10) #引数を渡すときはselfは無視し第2引数から書いていく #クラスのメソドを作成する2 def go_forward(self,num): print("move!"*num) #クラスからインスタンスを作成する kenji=Person("kenji") #メソドを使用してみる person.say_something() |
コンストラクタ と デストラクタ レベル3
コンストラクタ:初期化メソドのようなクラスを呼び出された時点で動作するメソドです。
def __init__(self,name=”名無し”):
デストラクタ:作ったオブジェクトを廃棄するときに使うメソドです。
def __del__(self):
デストラクタを実行するときは、明示的に del personと書くと良いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#クラスを作成する class Person(object): #コンストラクタ:初期化メソドを作成する(クラスを呼び出された時点で動作するメソド) def __init__(self,name="名無し"): #値を保持する場合はself.を使う self.name=name print("私の名前は",self.name,"です") #クラスのメソドを作成する1 def say_something(self): print("こんにちは{}です".format(self.name)) #メソドの中で他のメソドを使用する self.run(10) #引数を渡すときはself部分は無視して、第2引数から書いていく #クラスのメソドを作成する2 def run(self,num): print("run"*num) #デストラクタ def __del__(self): print("good by") #クラスからインスタンスを作成する kenji=Person("kenji") #メソドを使用してみる person.say_word() #明示的にデストラクタを呼び出す del person print("#####################") |
クラスの継承 レベル4
class Car(object):というクラスが予め存在しているとします。
後から作るHondaCarクラスがほとんどCarクラスと同じだった場合、クラスの承継という操作をすることで、Carクラスの持っているメソドを丸ごとコピーできます。これによって、重複するメソドをなくしてスクリプトを綺麗にできます。
class HondaCar(Car): これだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#クラスを作成する class Car(object): #メソドを作成する def run(self): print("run") #CarクラスをHondaCarクラスが引き継ぐ class HondaCar(Car): pass #CarクラスをTeslaCarクラスが引き継ぐ class TeslaCar(Car): #メソドを作成する def auto_run(self): print("auto run") #Carクラスのインスタンスを作成 car=Car() car.run() print("##########################") #HondaCarクラスのインスタンスを作成 honda_car=HondaCar() honda_car.run() #HondaCarクラスはrunメソドを持っていないが #Carクラスから継承したものを使用できる。 print("##########################") #TeslaCarはCarから継承したrunメソドと自分がはじめから持っている #auto_runメソドの両方を使用できる。 tesla_car=TeslaCar() tesla_car.run() tesla_car.auto_run() |
クラスのオーバーライド(上書き)レベル5
クラスのオーバーライド(上書き)とは:
クラスを継承したとき全てのメソドを継承するわけですが、その後で”同名のメソド”を定義すると継承したメソドが上書きされ再定義されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#クラスを作成する class Car(object): #初期化メソド:クラス変数にモデル名を追加 def __init__(self,model=None): self.model=model #メソドを作成する def run(self): print("run") #CarクラスをHondaCarクラスが引き継ぐ class HondaCar(Car): #継承したメソドと同名のメソドを定義するとオーバーライドになる。 def run(self): print("fast") #なにかしらのメソドの定義 self.enable_auto_run=enable_auto_run #継承したメソドと同名のメソドを定義するとオーバーライドになる。 def run(self): print("super fast") #メソドを作成する def auto_run(self): print("auto run") #Carクラスのインスタンスを作成 car=Car() car.run() print("##########################") #HondaCarクラスのインスタンスを作成 Honda_car=ToyotaCar() Honda_car.run() #HondaCarクラスはrunメソドを持っていないが #Carクラスから継承したものを使用できる。 Honda_car=HondaCar("NSX") #モデル名を引数として渡した print(Honda_car.model) |
スーパークラス レベル6
スーパークラスとは:
継承した元のクラス、親クラスのことです。
例として、(Carクラス)の__init__初期化メソドを流用してみましょう。
super().__init__(model)の部分です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#CarクラスをTeslaCarクラスが引き継ぐ class TeslaCar(Car): #初期化メソド:Carクラスを継承したが、オーバーライド(上書き)してみる #→引数の初期値変更と追加のため def __init__(self,model="Model R",enable_auto_run=False): # ここで、いつもならself.model=modelを入れるが、 # これを毎回書かないで済む方法を考える #親クラス(Carクラス)の__init__メソドを使う super().__init__(model) print(self.model) #TeslaCarはCarから継承したrunメソドと自分がはじめから持っている #auto_runメソドの両方を使用できる。 tesla_car=TeslaCar("Model S") #モデル名を引数として渡した tesla_car.run() tesla_car.auto_run() |
まだまだ続きます
随時更新します。classの話は相当奥が深いのです。
2019.5.1 令和元年