見出し画像

python:__call__メソッドの基礎

コードの中でたまにみる_call__について今回は基礎的な使い方を自分なりにclassから順を追って、書いていきたいと思います。

コード全体

class Person:

   def __init__(self, name, nationality, age):
       self.name = name
       self.nationality = nationality
       self.age = age

   
   def __call__(self, name):
       print("こんにちは{}さん、私は{}です。出身は{}で年齢は{}歳です".format(name, self.name,self.nationality, self.age))
       

   def say_hello(self, name):
       print("こんにちは{}さん、私は{}です。出身は{}で年齢は{}歳です".format(name, self.name,self.nationality, self.age))
       
       
tamura = Person("タムラ", "日本", 100)
tamura.say_hello("佐藤")
tamura("佐藤")

#出力結果#
こんにちは佐藤さん、私はタムラです。出身は日本で年齢は100歳です
こんにちは佐藤さん、私はタムラです。出身は日本で年齢は100歳です

classとインスタンスについて

classは設計書のようなものです。インスタンスを作成する際に使用いたします。

※インスタンスとは実物です。

たとえば、建物を建てる時には設計書が必要です。その際には以下のように定義されます。

インスタンス=建物、class=建物を作る際の設計書


キャプチャ

よく、鯛焼き機と鯛焼きとの関係でも例えられていますよね。

建物を作るときには建物の大きさ、建物の色、建物の素材等、色々な材料が必要となりますので、その材料をclass(設計書)であらかじめ、設定して、インスタンスに肉付けしていきます。

実践

class Person:
"""
Personという設計書を作成する。
"""

"""
以下はPersonという設計書の中身。材料。
"""
   def __init__(self, name, nationality, age):
       self.name = name
       self.nationality = nationality
       self.age = age

Personという設計書を作る場合、class Personとする。

材料としては、名前、国籍、年齢

この設計書を用いて、インスタンスを作成してみる。


tamura = Person("タムラ","日本",100)

Person("材料1", "材料2", "材料3")を入力すれば、インスタンスを作成できます。上記ではtamuraという名前タムラ、国籍日本、100歳のインスタンスが作成できました。

ではこのインスタンスを呼び出してみる。

class Person:
   def __init__(self, name, nationality, age):
       self.name = name
       self.nationality = nationality
       self.age = age

   def say_hello(self, name):
       print("こんにちは"+ name + "さん、私は" + self.name + " です。")
       
   
tamura = Person("タムラ","日本",100)
tamura.say_hello("佐藤")

#出力結果#
こんにちは佐藤さん、私はタムラ です。

他の人を作ったり、国籍を呼び出してみる。

class Person:

   def __init__(self, name, nationality, age):
       self.name = name
       self.nationality = nationality
       self.age = age

   def say_hello(self, name):
       print("こんにちは"+ name + "さん、私は" + self.name + " です。")
       
   def say_age(self,nationality):
       print("こんにちは"+ nationality + "さん、私は" + self.nationality + " 人です。")
             
tamura = Person("タムラ","日本",100)
jack = Person("ジャック","コロンビア", 115)

tamura.say_hello("佐藤")
jack.say_hello("トオル")

tamura.say_age("アメリカ")
jack.say_age("日本")

#出力結果#
こんにちは佐藤さん、私はタムラ です。
こんにちはトオルさん、私はジャック です。

こんにちはアメリカさん、私は日本 人です。
こんにちは日本さん、私はコロンビア 人です。

callメソッドを使う

say_helloを使って、呼び出すメソッドを作っていたのをcallメソッドに置き換えるとさらにスマートになり、インスタンス自体を関数のように扱えるようになります。

class Person:
   def __init__(self, name, nationality, age):
       self.name = name
       self.nationality = nationality
       self.age = age

   def say_hello(self, name):
       print("こんにちは"+ name + "さん、私は" + self.name + " です。say_helloメソッド")
       
   def __call__(self, name):
       print("こんにちは"+ name + "さん、私は" + self.name + " です。callメソッド")
             
tamura = Person("タムラ","日本",100)
tamura.say_hello("佐藤")
tamura("佐藤")

#出力結果#
こんにちは佐藤さん、私はタムラ です。say_helloメソッド
こんにちは佐藤さん、私はタムラ です。callメソッド

tamuraが関数となり、tamura("")でcallメソッドが呼び出すことができました。

個人的に行うプログラミングではclassやcallメソッドはあまり見かけないかもしれませんが、覚えておいて損はないと思います。

その他の記事

その他の記事もご参照いただければ幸いです。



この記事が気に入ったらサポートをしてみませんか?