見出し画像

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による親メソッドの呼び出し」


いいなと思ったら応援しよう!