Python資格取得への道のり 16日目
今日からオブジェクトとクラスに!
プログラミングに触ったことない人はyoutube等でイメージをつけることが重要。それをやった上で下記に取り組みます。
・クラスの定義
class Person(object):
def say_something(self):
print('hello')
person = Person()
person.say_something()
Person().say_something()
#hello
#hello
Personというオブジェクトを定義して、「オブジェクト.関数」という形で出力してみました。
Python3から「class Person(object):」については「class Person:」で問題はありませんが、Python2からの名残やこれから継承のために書いておいても問題ありません。
ちなみに「class Person():」でも問題ありません。
・クラスの初期化とクラス変数
初期化は「__init__」を使用する。
どんな作用を起こすかというと下記が具体例。
class Person:
def __init__(self):
print('Start')
def say_something(self):
print('hello')
person = Person()
#Start
中身のsay_somethingは実行していないが、出力はされる。
これがクラスの初期化。
呼び出された時に行うものを__init__(self)で定義する。
・クラスで引数を使用する
class Person:
def __init__(self, name):
self.name = name
print(self.name)
def say_something(self):
print('hello')
person = Person('Jon')
#Jon
上記の例では「Jon」をnameに渡して、さらにそれをself.nameに渡して出力する。
オブジェクトはselfは自分自身の値として保持しなければならない。
これを利用して別の関数でも呼び出せる。
class Person:
def __init__(self, name):
self.name = name
def say_something(self):
print('I am {}. hello'.format(self.name))
person = Person('Jon')
person.say_something()
#I am Jon. hello
クラスでメソッドを定義する際は、必ずselfが必要。
selfを抜かすと、エラ〜になる。
class Person:
def __init__(self, name):
self.name = name
def say_something():
print('I am {}. hello'.format(self.name))
person = Person('Jon')
person.say_something()
#エラー
#say_something()にselfがないため
またメソッドの中で自分の他のメソッドを定義し、呼び出すことも可能。
class Person:
def __init__(self, name):
self.name = name
def say_something(self):
print('I am {}. hello'.format(self.name))
self.run()
def run(self):
print('run')
person = Person('Jon')
person.say_something()
#I am Jon. hello
#run
・コンストラクタとデストラクタ
class Person:
#########
下記をコンストラクタ
#########
def __init__(self, name):
self.name = name
def say_something(self):
print('I am {}. hello'.format(self.name))
self.run()
def run(self):
print('run')
#########
下記をデストラクタ
#########
def __del__(self):
print('end')
person = Person('Jon')
person.say_something()
print('###########')
#I am Jon. hello
#run
############
#end
def __init__をコンストラクタ
def __del__をデストラクタ と言います。
明示的にdelを呼びたい場合は下記のように記載する。
class Person:
def __init__(self, name):
self.name = name
def say_something(self):
print('I am {}. hello'.format(self.name))
self.run()
def run(self):
print('run')
def __del__(self):
print('end')
person = Person('Jon')
person.say_something()
del person
print('###########')
#I am Jon. hello
#run
#end
############
・クラスの継承
クラスの継承は、あるクラスが他のクラスをオブジェクトの機能を引き継いで拡張するイメージ
具体的には下記。
class Car の機能を class Toyota が引き継ぐ
また class Nissanも class Carで Carの機能を引き継ぐ
class Car(object):
def run(self):
print('run')
class Toyota(Car):
pass
class Nissan(Car):
def auto_run(self):
print('auto run')
car = Car()
car.run()
print('#################')
toyota_car = Toyota()
toyota_car.run()
print('#################')
nissan = Nissan()
nissan.run()
nissan.auto_run()
#run
#################
#run
#################
#run
#auto run
上記のようにToyotaのメソッドでは、特に何も定義せず「pass」だけでしたが、toyotaはrunというCarのメソッドを使用することができる。
Nissanのメソッドでは「auto_run」は定義しているものの、「run」は定義していないのに、クラスを継承したことでCarのメソッドである「run」を使用することができる。
class クラス名(object)としていた「object」のところに継承したいクラスを入れることでクラスを継承できる。
今日のまとめ
今日はここまで!
オブジェクトとクラスも長いセクションではないため、明後日には終わってしまいます。どのような機能を持っているのか、頭の中を整理して基礎を終わらしていきます。
明日は「メソッドのオーバーライドとsuperによる親メソッドの呼び出し」