きっかけ
classの概念は初心者である私にとって非常に難しい。
今まで学習から逃げ続けてきたが、現在取り組んでいるkaggleコンペではよく、sklearnの準拠モデルから、分類器を作成しているのをよく見かけますので、復習も兼ねて再整理をしてみます。
クラスの定義とインスタンス(オブジェクト)の生成
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
継承:既存のクラスが持つ機能を新しいクラスですべて引き継ぐ
継承におけるメソッドの追加
'''
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