Python 無料で独習 015 クラス 

クラスPython
この記事は約5分で読めます。

Class クラス

今回の講義はクラスです。
今西先生も学生時代、JAVAを学ぶときにクラスの
概念の理解がなかなか腑に落ちなかったとの事。
なかなかの強敵のようです。

冒頭の説明では
クラスは家の設計図のようなもので
その設計図を元にいろんな家を建てていくイメージみたいです。

いつもの事ですが、現時点ではあまりわからないので
実際にコードを書きながら学んでいきたいと思います。

init 関数

今回はPerasonという人に関するクラス(設計書)を書きます。
Classの中には二つの特別な関数があり、
その一つが init 関数だそうです。
主に初期化を設定するそうです。
この辺りも話だけではわかりにくので、講義で言われるがまま
コードを書きます。
ちなみに#から始まる文字列はコメントとして書く事ができて
これはコードに反映されません。

class Person:
#初期設定
#引数の中に名前、国籍、年齢を入れていますが
#それとは別に必ず self を入れないといけないみたいです。
  def __init__ (self,name,nationality,age):
    self.name = name
    self.nationality = nationality
    self.age = age

ここまでのコードで人というクラス(設計書)ができます。
このクラスから実際に名前、国籍、年齢をいれて
特定の個人を作ることをインスタンス化というそうです。

なんとなく概要が理解できてきました。

例として佐藤という人(インスタンス)を作成します。

class Person:
#初期設定
  def __init__ (self,name,nationality,age):
    self.name = name
    self.nationality = nationality
    self.age = age

#インスタンス化(実体化)
satou = Person('佐藤','日本',30)

#クラス内で定義されている変数を「属性」といいます。
#その属性を出力します。
satou.name
佐藤
satou.nationality
日本
satou.age
30

次にmikeという人(インスタンス)を作成します。

mike = Person('マイク','イギリス',30)

#佐藤と同様に属性を出力していきます。
mike.name
マイク

mike.nationality
イギリス

mike.age
30

さらにclass Person の中に関数を作ります。

クラス内の関数 メソッド

class Person:
  #初期設定
  def __init__ (self,name,nationality,age):
    self.name = name
    self.nationality = nationality
    self.age = age

#クラスの中で定義される関数を「メソッド」といいます。
  def say_hello():
    print('こんにちは。{}さん。私は佐藤です。'.format(name))

#佐藤でインスタンスを作成
satou = Person('佐藤','日本',30)

#クラス内で定義されたメソッドを実行
satou.say_hello('鈴木')
こんにちは。鈴木さん。私は佐藤です。

次はmikeでインスタンス作成とメソッド実行をします。

mike = Person('マイク','イギリス',30)
mike.say_hello('鈴木')
こんにちは。鈴木さん。私は佐藤です。

mikeでインスタンスを作成して
メソッドを実行しましたが、
print('こんにちは。{}さん。私は佐藤です。'.format(name))
コード内に 私は佐藤です と書かれているので
出力もそのまま反映されます。

なんとかインスタンス毎に佐藤の部分を変えたい。
そこで、今まで呪文のように書かされてきた
self
の出番だそうです。
フォーマット関数の二つ目の引数にself.nameを入れます。

class Person:
  #初期設定
  def __init__ (self,name,nationality,age):
    self.name = name
    self.nationality = nationality
    self.age = age

  def say_hello(self,name):
    print('こんにちは。{}さん。私は{}です。'.format(name,self.name))

satou = Person('佐藤','日本',30)
satou.say_hello('鈴木')
こんにちは。鈴木さん。私は佐藤です。

mike = Person('マイク','イギリス',30)
mike.say_hello('鈴木')
こんにちは。鈴木さん。私はマイクです。

#self は呼び出したインスタンス自身を指します

call関数

class Person:
  #初期設定
  def __init__ (self,name,nationality,age):
    self.name = name
    self.nationality = nationality
    self.age = age

  def __call__(self):
    print('ここはcall関数です。')

  def say_hello(self,name):
    print('こんにちは。{}さん。私は{}です。'.format(name,self.name))

init関数のすぐ下にcall関数を書きました。
インスタンスを作成して、call関数を実行してみます。

satou = Person('佐藤','日本',30)
satou.__call__()

ここはcall関数です。

通常のメソッドを呼び出す感じでcall関数を実行することができました。
ところが、call関数の呼び出し方はこうではなくて、
インスタンス名()
で呼び出すことができます。

satou()
ここはcall関数です

以上で今回の講義は終了だそうです。
いやぁ~内容が濃かったです。
でもなんとか理解する事ができました。。。。。
今西先生、ありがとうございました。

コメント

タイトルとURLをコピーしました