pythonでクラスと戦う

classの使い方が本当にピンとこないんですよぉ…………
ということで戦って行きたいと思います。

基本

・「クラス」とはオブジェクトの設計図である
・「オブジェクト」って要するにインスタンス。へー。
・クラスの中に入ってる関数を「メソッド」と呼ぶ

基本的な使い方

class hoge:
   def nya(self):
       print('にゃーん')
       
   def wan(self,name):
       print(name + ':わーん')
hoge1 = hoge()
hoge1.nya() # にゃーん
hoge1.wan('ポチ') # ポチ:わーん

class クラス名:  でクラスを作ってー
中に関数(メソッド)書いてー
変数にクラス代入してオブジェクト(インスタンス)作ってー
変数.メソッド() でメソッドを実行~

コンストラクタとインスタンス変数

class hoge:
   
   def __init__(self,name):
       self.name = name
   def nya(self):
       print(self.name + ':にゃーん')
      
   def wan(self):
       print(self.name + ':わーん')

hoge1 = hoge('シロ')
hoge1.nya() # シロ:にゃーん

hoge2 = hoge('ミケ')
hoge2.nya()  # ミケ:にゃーん

hoge1.wan() # シロ:わーん
# 「シロ」はhoge1オブジェクトのインスタンス変数なので、
# hoge2に「ミケ」を渡した後でも保持されている

・__init__という名前のメソッドは「コンストラクタ」と呼ばれる特別なメソッドで、オブジェクトが生成されるときに自動で呼ばれる
・コンストラクタ内にself.hogeの形式で変数を作っておけば、オブジェクト内でいつでも使える。(インスタンス変数と呼ぶよ!)
・コンストラクタに引数を設定しておいて、オブジェクトを生成する時に渡す。
・複数のオブジェクトを生成した場合、オブジェクト毎にインスタンス変数は保持される。

クラス変数とクラスメソッド

class hoge:
   nyan = ':にゃーん'    # メソッドの外に書けば同じクラス内のオブジェクト全部共通で使える
   __num = 0          # 変数前に__すればプライベート変数=クラス外から呼べない
   def __init__(self,name):
       self.name = name
       hoge.__num += 1
       print(str(hoge.__num) + "匹目だよ")
   def nya(self):
       print(self.name + hoge.nyan)
   @classmethod
   def count(cls):
        print(str(hoge.__num) + "匹いるよ")
        # @classmethodして、引数にselfではなくclsを取るとクラスメソッド(全クラス共通で使える)
        # これで同じクラスのオブジェクトがいくつあるかを表示できるというか
     # オブジェクト作らなくてもこのメソッドにはアクセスできる

hoge1 = hoge('シロ')
hoge1.nya()
hoge2 = hoge('ミケ')
hoge2.nya()
hoge.count()

出力

1匹目だよ
シロ:にゃーん
2匹目だよ
ミケ:にゃーん
2匹いるよ

どのオブジェクトでも共通で使いたい変数は、クラス変数としてコンストラクタやメソッドの外に書く。
使いたいときは クラス名.変数名。

アクセス制限

変数やメソッド名の頭に__(アンダーバーふたつ)を付けるとクラスの外からは一応呼び出せなくなる。(プライベート変数/プライベートメソッド)
(でも「_クラス名__プライベート変数()」で呼ぶと呼べちゃう)

クラスの継承とオーバーライド

class cat:
    def __init__(self,name):
        self.name = name
    def nyan(self):
        print(self.name + ":にゃーん")

class kitty(cat):    # 子クラスを作る
    def nyan(self):    # nyanメソッドをオーバーライド
        print(self.name + ":みーぃ")

mike = cat("ミケ")
mike.nyan()    # ミケ:にゃーん
siro = kitty("シロ")
siro.nyan()    # シロ:みーぃ

catクラスをベースに、ちょっと特別な時だけ使うkittyクラスを作る例。
子クラス(親クラス): と記述すると、親クラスのメソッドとかそのまま全部使える子クラスを作れる。(継承)
親クラスと同じ名前のメソッドを作れば、子クラスのメソッドが優先される。(オーバーライド)


この記事が気に入ったらサポートをしてみませんか?