🍣

Python100本ノック#3 オブジェクトの属性(attribute)

2023/11/27に公開

マジックメソッド(Magic Method)

__XXX___のメソッドはマジックメソッドといい、特殊機能を持つため特殊メソッド(Special method)と呼ぶことが多い。

読み方

英語圏では、__XXX___を "dunder init" と略して発音するらしい。
Ref:https://qiita.com/little_hand_s/items/7273e0f07d2c76120942

__init__() コンストラクタ (イニシャライザ)

オブジェクトをインスタンス化する際に、その中の属性は__init__()関数に自動的に渡され、実行される。__init__()関数の引数リストには、常に先頭に新しく作成されたそのインスタンスオブジェクトを指すselfという名前の引数になっている。
__init__(self, [, ...]) になる。
コンストラクタ またはイニシャライザとよばれる。

ユースケース

インスタンスの初期化に利用される。

具体例

# 1、クラスを定義
class Person():
    # 初期化の属性設定
    def __init__(self, name, age):
        # self.オブジェクトの属性 = パラメータ
        self.name = name
        self.age = age

# 2、インスタンス化の際にパラメータを付与する
p1 = Person('Kobayashi', 75)
# 3、属性の呼び出し
print(p1.name)
print(p1.age)

output

Kobayashi
75

__str()__

__str__() メソッドはクラスのreturnを定義できる。デフォルトでは、オブジェクトをprint()するとオブジェクトのメモリアドレスが表示される。__str__() メソッドが定義されている場合、そのメソッド内で返されたデータが表示される。

ユースケース

returnを設定するに利用される。

具体例

__str__() メソッドが定義されていないクラス:

class Car():
    def __init__(self, brand, model, color):
        self.brand = brand
        self.model = model
        self.color = color

c1 = Car('Toyota', '6BA-MXAA54', 'Black')
print(c1)

output

<__main__.Car object at 0x0000021613C465D0>

__str__() メソッドが定義されているクラス:

class Car():
    def __init__(self, brand, model, color):
        self.brand = brand
        self.model = model
        self.color = color

    def __str__(self):
        return f'メーカー:{self.brand},型式:{self.model},カラー:{self.color}'

c1 = Car('Toyota', '6BA-MXAA54', 'Black')
print(c1)

output

メーカー:Toyota,型式:6BA-MXAA54,カラー:Black

__del()__ デストラクタ (ファイナライザ)

__del__(self) はインスタンスが破棄される (リソースが解放される) ときに呼び出されるメソッドである。コンストラクタと対になるメソッドで、デストラクタまたはファイナライザとよばれる。

ユースケース

実際の開発では、ファイルやDBコネクションなどを閉じる操作に利用されることが多いらしい。

具体例

class Person():
    # コンストラクタ__init__
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    # デストラクタ__del__
    def __del__(self):
        print(f'{self}解放された。')

# インスタンス化
p1 = Person('Tanaka', 200)
# p1と手動で解放させる
del p1
print(p1)

output

<__main__.Person object at 0x0000029E29F66610>解放された。
Traceback (most recent call last):
  File "C:\MyPythonCodes\Python100knock\03___del__について.py", line 16, in <module>
    print(p1)
          ^^
NameError: name 'p1' is not defined

Discussion