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メソッドはあまり見かけないかもしれませんが、覚えておいて損はないと思います。
その他の記事
その他の記事もご参照いただければ幸いです。
この記事が気に入ったらサポートをしてみませんか?