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関数です
以上で今回の講義は終了だそうです。
いやぁ~内容が濃かったです。
でもなんとか理解する事ができました。。。。。
今西先生、ありがとうございました。
コメント