LoginSignup
8
12

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-08-11

きっかけ

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

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

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

image.png

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
car2 = Car()
car2.model = 'sedan'
car2.color = 'gray'
car2.display()
model: sedan
model: gray

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

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

__init__メソッド

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

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

方法①

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

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

class クラス名:

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

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

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

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

マングリング

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

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
car1.accelerate(50)
car1.accelerate(60)
car1.display()
model: roadster
color: red
speed: 100

クラス属性

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()

継承とオーバーライド

'''
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

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

'''
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 単行本 松浦 健一郎 (著), 司 ゆき (著)
sklearn準拠モデルの作り方
https://techacademy.jp/magazine/18842

8
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12