【Python入門】クラスの使い方


#きっかけ

classの概念は初心者である私にとって非常に難しい。

今まで学習から逃げ続けてきたが、現在取り組んでいるkaggleコンペではよく、sklearnの準拠モデルから、分類器を作成しているのをよく見かけますので、復習も兼ねて再整理をしてみます。


#クラスの定義とインスタンス(オブジェクト)の生成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374781/4e23349c-560e-4bf3-d4f8-869fa2b8e5b9.png)

```py
class Car:
    def display(self):
        print('model:', self.model)
        print('model:', self.color)


car1 = Car()
car1.model = 'boxcar'
car1.color = 'white'
car1.display()
```

```
model: boxcar
model: white
```

```py
car2 = Car()
car2.model = 'sedan'
car2.color = 'gray'
car2.display()
```

```
model: sedan
model: gray
```

メソッドとは、クラス内で定義した関数のこと。
構造は、

```py
class クラス名:
     def メソッド名(self, 引数)
         処理
```


#`__init__`メソッド

```py
class Car:

    def __init__(self, model, color):
        self.model = model
        self.color = color

    def display(self):
        print('model:', self.model)
        print('color:', self.color)
car1 = Car('roadster', 'red')
car1.display()
```

```
model: roadster
color: red
```

インスタンスのデータ属性名に値を設定するには...

方法①

```py
変数 = クラス名
変数.データ属性名 = 値
```

方法②　インスタンス生成と同時に、データ属性を設定

```py
class クラス名:

    def __init__(self, 引数, ...):
        self.データ属性名 = 値

変数 = クラス名(引数, ...)
```

メリット：
①データ属性の設定が防げる!
②プログラムを簡潔にできる!

*コンストラクタとは、インスタンスが生成される時に実行されるメソッド（関数）の一種です。インスタンスの生成、扱う変数などの初期化を主に行います。

#マングリング
クラス内部だけで使うメソッドを定義。
内部だけで使うメソッドを間違って外部から呼ぶのを防ぐ。

```py
class Car:

    def __init__(self, model, color):  #__init__はマングリングではない
        self.model = model
        self.color = color
        self.speed = 0

    def display(self):
        print('model:', self.model)
        print('color:', self.color)
        print('speed:', self.speed)

    def accelerate(self, pressure):
        self.speed += pressure
        self.__check_speed()          #__check_speedメソッド呼び出し

    def __check_speed(self):          #__check_speedはマングリング
        if self.speed > 100:
            self.speed = 100

car1 = Car('roadster', 'red')
car1.display() #()が抜けるとメソッド呼び出しができない
```

```
model: roadster
color: red
speed: 0
```

```py
car1.accelerate(50)
car1.accelerate(60)
car1.display()
```

```
model: roadster
color: red
speed: 100
```

#クラス属性

```py
class Car:
    
    SPEED_LIMIT = 90
    
    def __init__(self, model, color):  #__init__はマングリングではない
        self.model = model
        self.color = color
        self.speed = 0
        
    def display(self):
        print('model:', self.model)
        print('color:', self.color)
        print('speed:', self.speed)
    
    def accelerate(self, pressure):
        self.speed += pressure
        self.__check_speed()
        
    def __check_speed(self):          #__check_speedはマングリング
        if self.speed > Car.SPEED_LIMIT:  #or self.SPEED_LIMIT でもOK
            self.speed = Car.SPEED_LIMIT
            
car1 = Car('roadster', 'red')
car1.accelerate(40)
car1.accelerate(60)
car1.display()
```

#継承とオーバーライド

```py
'''
class Car:
    
    SPEED_LIMIT = 90
    
    def __init__(self, model, color):  #__init__はマングリングではない
        self.model = model
        self.color = color
        self.speed = 0
        
    def display(self):
        print('model:', self.model)
        print('color:', self.color)
        print('speed:', self.speed)
    
    def accelerate(self, pressure):
        self.speed += pressure
        self.__check_speed()
        
    def __check_speed(self):          #__check_speedはマングリング
        if self.speed > Car.SPEED_LIMIT:  #or self.SPEED_LIMIT でもOK
            self.speed = Car.SPEED_LIMIT
'''

class Truck(Car): #Carクラスを基底として、Truckクラスを派生される
    
    def __init__(self, model, color, cargo): #cargo追加
        Car.__init__(self, model, color)
        self.cargo = cargo
    
    def display(self):
        print('cargo:', self.cargo)
        
truck1 = Truck('trailer', 'yellow', 'potato')
truck1.accelerate(30)
truck1.display()
```

```
cargo: potato
```

継承：既存のクラスが持つ機能を新しいクラスですべて引き継ぐ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374781/5007a000-545f-4955-d504-200743fa64a9.png)



#継承におけるメソッドの追加

```py
'''
class Car:
    
    SPEED_LIMIT = 90
    
    def __init__(self, model, color):  #__init__はマングリングではない
        self.model = model
        self.color = color
        self.speed = 0
        
    def display(self):
        print('model:', self.model)
        print('color:', self.color)
        print('speed:', self.speed)
    
    def accelerate(self, pressure):
        self.speed += pressure
        self.__check_speed()
        
    def __check_speed(self):          #__check_speedはマングリング
        if self.speed > Car.SPEED_LIMIT:  #or self.SPEED_LIMIT でもOK
            self.speed = Car.SPEED_LIMIT
'''

class Truck(Car):

#オーバーライド    
    def __init__(self, model, color, cargo):
        Car.__init__(self, model, color)
        self.cargo = cargo

    def display(self):
        Car.display(self)
        print('cargo:', self.cargo)

#新規メソッド
    def load(self, cargo):
        self.cargo = cargo
        
truck1 = Truck('trailer', 'yellow', 'potato')
truck1.load('lettuce')
truck1.display()
```

```
model: trailer
color: yellow
speed: 0
cargo: lettuce
```




#参照
・[100問でわかるPython 単行本 松浦 健一郎  (著), 司 ゆき (著)](https://www.amazon.co.jp/100%E5%95%8F%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8BPython-%E6%9D%BE%E6%B5%A6-%E5%81%A5%E4%B8%80%E9%83%8E/dp/4802611285)
・[sklearn準拠モデルの作り方](https://qiita.com/roronya/items/fdf35d4f69ea62e1dd91)
・https://techacademy.jp/magazine/18842