テクノロジー 開発 非公開: Python の __init__ とは何ですか? 【実例付き】

Python の __init__ とは何ですか? 【実例付き】

Python でオブジェクト指向設計を始めてみませんか? Python の __init__ メソッドについて学び、今すぐ最初の一歩を踏み出しましょう。

このチュートリアルでは、Python のクラスとオブジェクトの基本を説明し、次に __init__ メソッドについて学習します。

このチュートリアルを終了するまでに、次の質問に答えられるようになります。

  • インスタンス変数またはインスタンス属性とは何ですか?
  • init メソッドはインスタンス属性の初期化にどのように役立ちますか?
  • 属性のデフォルト値を設定するにはどうすればよいでしょうか?
  • クラスメソッドをコンストラクターとして使用してオブジェクトを作成するにはどうすればよいでしょうか?

始めましょう。

Python の __init__ とは何ですか? 【実例付き】
Python の __init__ とは何ですか? 【実例付き】

Python のクラスとオブジェクト

クラスは、Python のオブジェクト指向プログラミングの基礎です。クラスを作成し、 属性 メソッド を定義して、 データ と関連する 機能 をバインドできます。

クラスを作成したら、それをブループリント (またはテンプレート) として使用して、オブジェクト (インスタンス) を作成できます。

👩‍🏫例です!このクラスのすべてのオブジェクトが次の属性を持つ Employee クラスを作成しましょう。

  • full_name : firstName lastName 形式の従業員のフルネーム
  • emp_id : 従業員ID
  • department : 所属する部門
  • experience : 経験年数
Python のクラスとオブジェクト
Python のクラスとオブジェクト

これはどういう意味ですか? 🤔

個々の従業員は、 Employee クラスのインスタンスまたはオブジェクトになります。また、各オブジェクトには、 full_name emp_id department experience に独自の値があります。

これらの属性は インスタンス変数 とも呼ばれ、属性とインスタンス変数という用語を同じ意味で使用します。

属性の追加については後ほど説明します。現時点では、次のように Employee クラスを作成します。

 class Employee:
    pass

pass (プレースホルダーとして) 使用すると、スクリプト実行時のエラーを回避できます。

現在のバージョンの Employee クラスはあまり役に立ちませんが、それでも 有効な クラスです。したがって、 Employee クラスのオブジェクトを作成できます。

 employee_1 = Employee()

print(employee_1)
#Output: <__main__.Employee object at 0x00FEE7F0>

以下に示すように、属性を追加して値で初期化することもできます。

 employee_1.full_name = 'Amy Bell'
employee_1.department = 'HR'

ただし、インスタンス属性を追加するこのアプローチは非効率的であり、エラーが発生しやすくなります。また、オブジェクトを作成するためのテンプレートとしてクラスを使用することはできません。ここで __init__ メソッドが役立ちます。

Python クラスの __init__ メソッドの役割を理解する

Python クラスのメソッド
Python クラスのメソッド

オブジェクトをインスタンス化するときにインスタンス変数を初期化できる必要があり、 __init__ メソッドがそれを支援します。 __init__ メソッドは、クラスの新しいオブジェクトが作成されるたびに呼び出され、インスタンス変数の値が初期化されます。

C++ などの言語でプログラミングしたことがある場合は、 __init__ メソッドがコンストラクターと同様に機能することがわかります。

__init__ メソッドの定義

__init__ メソッドを Employee クラスに追加しましょう。

 class Employee:
    def __init__(self, full_name,emp_id,department,experience):
        self.full_name = full_name
        self.emp_id = emp_id
        self.department = department
        self.experience = experience

self パラメータはクラスのインスタンスを参照し、 self.attribute インスタンス attribute 右側の値に初期化します。

次のようにオブジェクトを作成できるようになりました。

 employee_2 = Employee('Bella Joy','M007','Marketing',3)
print(employee_2)
# Output: <__main__.Employee object at 0x017F88B0>

従業員オブジェクトを出力するとき、従業員が属しているクラス以外の有益な情報は得られません。クラスの表現文字列を定義する __repr__ メソッドを追加しましょう。

 def __repr__(self):
        return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."

__repr__ Employee クラスに追加すると、次のようになります。

 class Employee:
    def __init__(self, full_name,emp_id,department,experience):
        self.full_name = full_name
        self.emp_id = emp_id
        self.department = department
        self.experience = experience
    
     def __repr__(self):
        return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."

これで、従業員オブジェクトには便利な表現文字列が追加されました。

 print(employee_2)
# Output: Bella Joy,M007 from Marketing with 3 years of experience.

いくつかの慣例

先に進む前に、いくつか注意事項を記載しておきます。

  • __init__ メソッドの最初のパラメーターとして self を使用してクラス インスタンス自体を参照し、 self.attribute_name を使用してさまざまな属性を初期化しました。 self を使用することが推奨される規則です (ただし、他の名前を使用することもできます)。
  • __init__ メソッドを定義するときは、属性の名前と一致するように __init__ 定義内のパラメーター名を設定します。これにより可読性が向上します。

属性のデフォルト値を追加する方法

属性のデフォルト値を追加する方法
属性のデフォルト値を追加する方法

これまでコーディングした例では、すべての属性が 必須 です。つまり、オブジェクトの作成は、すべてのフィールドの値をコンストラクターに渡した場合にのみ成功します。

experience 属性の値を渡さずに、Employee クラスのオブジェクトをインスタンス化してみます。

 employee_3 = Employee('Jake Lee','E001','Engineering')

次のエラーが表示されます。

 Traceback (most recent call last):
  File "main.py", line 22, in <module>
    employee_3 = Employee('Jake Lee','E001','Engineering')
TypeError: __init__() missing 1 required positional argument: 'experience'

ただし、特定の属性を オプションに したい場合は、 __init__ メソッドを定義するときにそれらの属性にデフォルト値を指定することで実現できます。

ここでは、 experience 属性にデフォルト値 0 を指定します。

 class Employee:
    def __init__(self, full_name,emp_id,department,experience=0):
        self.full_name = full_name
        self.emp_id = emp_id
        self.department = department
        self.experience = experience
    
     def __repr__(self):
        return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."

employee_3 オブジェクトは、 experience 属性の値なしで作成されます。デフォルト値の 0 が experience に使用されます。

 employee_3 = Employee('Jake Lee','E001','Engineering')
print(employee_3.experience)
# Output: 0

クラスメソッドを使用した代替クラスコンストラクター

クラスメソッドを使用した代替クラスコンストラクター
クラスメソッドを使用した代替クラスコンストラクター

これまでは、 __init__ メソッドを定義し、必要に応じて属性のデフォルト値を設定する方法のみを見てきました。また、コンストラクターで 必須の 属性の値を渡す必要があることもわかります。

ただし、場合によっては、これらのインスタンス変数 (または属性) の値が、タプル、辞書、JSON 文字列などの別のデータ構造で利用できる場合があります。

どうしようか?

例を挙げてみましょう。 Python 辞書にインスタンス変数の値があるとします。

 dict_fanny = {'name':'Fanny Walker','id':'H203','dept':'HR','exp':2}

次のように辞書を利用してすべての属性を取得できます。

 name = dict_fanny['name']
id = dict_fanny['id']
dept = dict_fanny['dept']
exp = dict_fanny['exp']

この後、これらの値をクラス コンストラクターに渡すことでオブジェクトを作成できます。

 employee_4 = Employee(name, id, dept, exp)
print(employee_4)
# Output: Fanny Walker,H203 from HR with 2 years of experience.

覚えておいてください: 作成する新しいオブジェクトごとにこれを行う必要があります。このアプローチは非効率的ですが、もっと改善できるはずです。 しかし、どうやって?

Python では、 クラス メソッドを コンストラクター として使用して、クラスのオブジェクトを作成できます。クラスメソッドを作成するには、 @classmethod デコレータを使用します。

ディクショナリを解析し、インスタンス変数値を取得し、それらを使用して Employee オブジェクトを構築するメソッドを定義しましょう。

    @classmethod
    def from_dict(cls,data_dict):
        full_name = data_dict['name']
        emp_id = data_dict['id']
        department = data_dict['dept']
        experience = data_dict['exp']
        return cls(full_name, emp_id, department, experience)

辞書のデータを使用してオブジェクトを作成する必要がある場合は、 from_dict() クラス メソッドを使用できます。

💡 クラスメソッドで self の代わりに cls が使用されていることに注意してください。 self を使用してインスタンスを参照するのと同じように、 cls 使用してクラスを参照します。また、クラス メソッドはオブジェクトではなくクラスにバインドされます。

したがって、クラス メソッド from_dict() を呼び出してオブジェクトを作成するときは、それを Employee クラスで呼び出します。

 emp_dict = {'name':'Tia Bell','id':'S270','dept':'Sales','exp':3}
employee_5 = Employee.from_dict(emp_dict)
print(employee_5)
# Output: Tia Bell,S270 from Sales with 3 years of experience.

n 人の従業員それぞれに辞書がある場合、 from_dict() クラス メソッドをコンストラクターとして使用して、オブジェクト内でインスタンスを作成できます。辞書からインスタント変数値を取得する必要はありません。

📝 クラス変数に関するメモ

ここでは、個々のインスタンスではなく、クラスにバインドされるクラス メソッドを定義しました。クラスメソッドと同様に、クラス変数を持つこともできます。

クラス メソッドと同様、 クラス変数は インスタンスではなくクラスにバインドされます。属性がクラスのすべてのインスタンスに対して固定値を取る場合、それらをクラス変数として定義することを検討できます。

よくある質問

1. Python で __init__ メソッドが必要なのはなぜですか?

クラス定義の __init__ メソッドを使用すると、クラスのすべてのインスタンスの属性またはインスタンス変数を初期化できます。 __init__ メソッドは、クラスの新しいインスタンスが作成されるたびに呼び出されます。

2. Python クラスに複数の __init__ メソッドを含めることはできますか?

Python クラスに複数の __init__ メソッドを持たせる目的は、オブジェクトをインスタンス化する複数のコンストラクターを提供することです。ただし、複数の __init__ メソッドを定義することはできません。複数の __init__ メソッドを定義した場合、2 番目の最新の実装が最初の実装を上書きします。ただし、 @classmethod デコレーターを使用して、オブジェクトをインスタンス化するコンストラクターとして使用できるクラス メソッドを定義できます。

3. クラスに __init__ メソッドを定義しない場合はどうなりますか?

__init__ メソッドを定義しない場合でも、オブジェクトをインスタンス化できます。ただし、インスタンス変数を手動で追加し、それぞれに値を割り当てる必要があります。コンストラクターでインスタンス変数の値を渡すことはできませ 。これではエラーが発生しやすいだけでなく、オブジェクトをインスタンス化するためのブループリントとしてクラスを用意するという目的も果たせなくなります。

4. __init__ メソッドの引数にデフォルト値を指定できますか?

はい、 __init__ メソッドを定義するときに 1 つ以上の属性にデフォルト値を指定できます。デフォルト値を指定すると、コンストラクターでこれらの属性をオプションにするのに役立ちます。コンストラクターでこれらの属性の値を渡さない場合、属性はデフォルト値を取得します。

5. __init__ メソッドの外部で属性を変更できますか?

はい、 __init__ メソッドの外部でいつでも属性の値を更新できます。特定のインスタンスを作成した後、インスタンスに新しい属性を動的に追加することもできます。

結論

このチュートリアルでは、 __init__ メソッドを使用してインスタンス変数の値を初期化する方法を学びました。これは簡単ですが、特に多数の属性がある場合には、繰り返しになる可能性があります。

興味があれば、 データクラス モジュール を調べてください。 Python 3.7 以降では、組み込みデータ クラス モジュールを使用して、データを保存するデータ クラスを作成できます。 __init__ およびその他の一般的に使用されるメソッドのデフォルト実装に加えて。これらには、型ヒント、複雑なデフォルト値、最適化のための優れた機能が多数付属しています。

次に、Python の if __name__==’__main__’ について詳しく学習します。

「 Python の __init__ とは何ですか? 【実例付き】」についてわかりやすく解説!絶対に観るべきベスト2動画

【Python入門⑲】クラスの初期化__init__()を、分かりやすく解説
“__new__ VS __init__” In Python Tutorial (Simplified Explantion)

Python でオブジェクト指向設計を始めてみませんか? Python の __init__ メソッドについて学び、今すぐ最初の一歩を踏み出しましょう。

このチュートリアルでは、Python のクラスとオブジェクトの基本を説明し、次に __init__ メソッドについて学習します。

このチュートリアルを終了するまでに、次の質問に答えられるようになります。

  • インスタンス変数またはインスタンス属性とは何ですか?
  • init メソッドはインスタンス属性の初期化にどのように役立ちますか?
  • 属性のデフォルト値を設定するにはどうすればよいでしょうか?
  • クラスメソッドをコンストラクターとして使用してオブジェクトを作成するにはどうすればよいでしょうか?

始めましょう。

Python の __init__ とは何ですか? 【実例付き】
Python の __init__ とは何ですか? 【実例付き】

Python のクラスとオブジェクト

クラスは、Python のオブジェクト指向プログラミングの基礎です。クラスを作成し、 属性 メソッド を定義して、 データ と関連する 機能 をバインドできます。

クラスを作成したら、それをブループリント (またはテンプレート) として使用して、オブジェクト (インスタンス) を作成できます。

👩‍🏫例です!このクラスのすべてのオブジェクトが次の属性を持つ Employee クラスを作成しましょう。

  • full_name : firstName lastName 形式の従業員のフルネーム
  • emp_id : 従業員ID
  • department : 所属する部門
  • experience : 経験年数
Python のクラスとオブジェクト
Python のクラスとオブジェクト

これはどういう意味ですか? 🤔

個々の従業員は、 Employee クラスのインスタンスまたはオブジェクトになります。また、各オブジェクトには、 full_name emp_id department experience に独自の値があります。

これらの属性は インスタンス変数 とも呼ばれ、属性とインスタンス変数という用語を同じ意味で使用します。

属性の追加については後ほど説明します。現時点では、次のように Employee クラスを作成します。

 class Employee:
    pass

pass (プレースホルダーとして) 使用すると、スクリプト実行時のエラーを回避できます。

現在のバージョンの Employee クラスはあまり役に立ちませんが、それでも 有効な クラスです。したがって、 Employee クラスのオブジェクトを作成できます。

 employee_1 = Employee()

print(employee_1)
#Output: <__main__.Employee object at 0x00FEE7F0>

以下に示すように、属性を追加して値で初期化することもできます。

 employee_1.full_name = 'Amy Bell'
employee_1.department = 'HR'

ただし、インスタンス属性を追加するこのアプローチは非効率的であり、エラーが発生しやすくなります。また、オブジェクトを作成するためのテンプレートとしてクラスを使用することはできません。ここで __init__ メソッドが役立ちます。

Python クラスの __init__ メソッドの役割を理解する

Python クラスのメソッド
Python クラスのメソッド

オブジェクトをインスタンス化するときにインスタンス変数を初期化できる必要があり、 __init__ メソッドがそれを支援します。 __init__ メソッドは、クラスの新しいオブジェクトが作成されるたびに呼び出され、インスタンス変数の値が初期化されます。

C++ などの言語でプログラミングしたことがある場合は、 __init__ メソッドがコンストラクターと同様に機能することがわかります。

__init__ メソッドの定義

__init__ メソッドを Employee クラスに追加しましょう。

 class Employee:
    def __init__(self, full_name,emp_id,department,experience):
        self.full_name = full_name
        self.emp_id = emp_id
        self.department = department
        self.experience = experience

self パラメータはクラスのインスタンスを参照し、 self.attribute インスタンス attribute 右側の値に初期化します。

次のようにオブジェクトを作成できるようになりました。

 employee_2 = Employee('Bella Joy','M007','Marketing',3)
print(employee_2)
# Output: <__main__.Employee object at 0x017F88B0>

従業員オブジェクトを出力するとき、従業員が属しているクラス以外の有益な情報は得られません。クラスの表現文字列を定義する __repr__ メソッドを追加しましょう。

 def __repr__(self):
        return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."

__repr__ Employee クラスに追加すると、次のようになります。

 class Employee:
    def __init__(self, full_name,emp_id,department,experience):
        self.full_name = full_name
        self.emp_id = emp_id
        self.department = department
        self.experience = experience
    
     def __repr__(self):
        return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."

これで、従業員オブジェクトには便利な表現文字列が追加されました。

 print(employee_2)
# Output: Bella Joy,M007 from Marketing with 3 years of experience.

いくつかの慣例

先に進む前に、いくつか注意事項を記載しておきます。

  • __init__ メソッドの最初のパラメーターとして self を使用してクラス インスタンス自体を参照し、 self.attribute_name を使用してさまざまな属性を初期化しました。 self を使用することが推奨される規則です (ただし、他の名前を使用することもできます)。
  • __init__ メソッドを定義するときは、属性の名前と一致するように __init__ 定義内のパラメーター名を設定します。これにより可読性が向上します。

属性のデフォルト値を追加する方法

属性のデフォルト値を追加する方法
属性のデフォルト値を追加する方法

これまでコーディングした例では、すべての属性が 必須 です。つまり、オブジェクトの作成は、すべてのフィールドの値をコンストラクターに渡した場合にのみ成功します。

experience 属性の値を渡さずに、Employee クラスのオブジェクトをインスタンス化してみます。

 employee_3 = Employee('Jake Lee','E001','Engineering')

次のエラーが表示されます。

 Traceback (most recent call last):
  File "main.py", line 22, in <module>
    employee_3 = Employee('Jake Lee','E001','Engineering')
TypeError: __init__() missing 1 required positional argument: 'experience'

ただし、特定の属性を オプションに したい場合は、 __init__ メソッドを定義するときにそれらの属性にデフォルト値を指定することで実現できます。

ここでは、 experience 属性にデフォルト値 0 を指定します。

 class Employee:
    def __init__(self, full_name,emp_id,department,experience=0):
        self.full_name = full_name
        self.emp_id = emp_id
        self.department = department
        self.experience = experience
    
     def __repr__(self):
        return f"{self.full_name},{self.emp_id} from {self.department} with {self.experience} years of experience."

employee_3 オブジェクトは、 experience 属性の値なしで作成されます。デフォルト値の 0 が experience に使用されます。

 employee_3 = Employee('Jake Lee','E001','Engineering')
print(employee_3.experience)
# Output: 0

クラスメソッドを使用した代替クラスコンストラクター

クラスメソッドを使用した代替クラスコンストラクター
クラスメソッドを使用した代替クラスコンストラクター

これまでは、 __init__ メソッドを定義し、必要に応じて属性のデフォルト値を設定する方法のみを見てきました。また、コンストラクターで 必須の 属性の値を渡す必要があることもわかります。

ただし、場合によっては、これらのインスタンス変数 (または属性) の値が、タプル、辞書、JSON 文字列などの別のデータ構造で利用できる場合があります。

どうしようか?

例を挙げてみましょう。 Python 辞書にインスタンス変数の値があるとします。

 dict_fanny = {'name':'Fanny Walker','id':'H203','dept':'HR','exp':2}

次のように辞書を利用してすべての属性を取得できます。

 name = dict_fanny['name']
id = dict_fanny['id']
dept = dict_fanny['dept']
exp = dict_fanny['exp']

この後、これらの値をクラス コンストラクターに渡すことでオブジェクトを作成できます。

 employee_4 = Employee(name, id, dept, exp)
print(employee_4)
# Output: Fanny Walker,H203 from HR with 2 years of experience.

覚えておいてください: 作成する新しいオブジェクトごとにこれを行う必要があります。このアプローチは非効率的ですが、もっと改善できるはずです。 しかし、どうやって?

Python では、 クラス メソッドを コンストラクター として使用して、クラスのオブジェクトを作成できます。クラスメソッドを作成するには、 @classmethod デコレータを使用します。

ディクショナリを解析し、インスタンス変数値を取得し、それらを使用して Employee オブジェクトを構築するメソッドを定義しましょう。

    @classmethod
    def from_dict(cls,data_dict):
        full_name = data_dict['name']
        emp_id = data_dict['id']
        department = data_dict['dept']
        experience = data_dict['exp']
        return cls(full_name, emp_id, department, experience)

辞書のデータを使用してオブジェクトを作成する必要がある場合は、 from_dict() クラス メソッドを使用できます。

💡 クラスメソッドで self の代わりに cls が使用されていることに注意してください。 self を使用してインスタンスを参照するのと同じように、 cls 使用してクラスを参照します。また、クラス メソッドはオブジェクトではなくクラスにバインドされます。

したがって、クラス メソッド from_dict() を呼び出してオブジェクトを作成するときは、それを Employee クラスで呼び出します。

 emp_dict = {'name':'Tia Bell','id':'S270','dept':'Sales','exp':3}
employee_5 = Employee.from_dict(emp_dict)
print(employee_5)
# Output: Tia Bell,S270 from Sales with 3 years of experience.

n 人の従業員それぞれに辞書がある場合、 from_dict() クラス メソッドをコンストラクターとして使用して、オブジェクト内でインスタンスを作成できます。辞書からインスタント変数値を取得する必要はありません。

📝 クラス変数に関するメモ

ここでは、個々のインスタンスではなく、クラスにバインドされるクラス メソッドを定義しました。クラスメソッドと同様に、クラス変数を持つこともできます。

クラス メソッドと同様、 クラス変数は インスタンスではなくクラスにバインドされます。属性がクラスのすべてのインスタンスに対して固定値を取る場合、それらをクラス変数として定義することを検討できます。

よくある質問

1. Python で __init__ メソッドが必要なのはなぜですか?

クラス定義の __init__ メソッドを使用すると、クラスのすべてのインスタンスの属性またはインスタンス変数を初期化できます。 __init__ メソッドは、クラスの新しいインスタンスが作成されるたびに呼び出されます。

2. Python クラスに複数の __init__ メソッドを含めることはできますか?

Python クラスに複数の __init__ メソッドを持たせる目的は、オブジェクトをインスタンス化する複数のコンストラクターを提供することです。ただし、複数の __init__ メソッドを定義することはできません。複数の __init__ メソッドを定義した場合、2 番目の最新の実装が最初の実装を上書きします。ただし、 @classmethod デコレーターを使用して、オブジェクトをインスタンス化するコンストラクターとして使用できるクラス メソッドを定義できます。

3. クラスに __init__ メソッドを定義しない場合はどうなりますか?

__init__ メソッドを定義しない場合でも、オブジェクトをインスタンス化できます。ただし、インスタンス変数を手動で追加し、それぞれに値を割り当てる必要があります。コンストラクターでインスタンス変数の値を渡すことはできませ 。これではエラーが発生しやすいだけでなく、オブジェクトをインスタンス化するためのブループリントとしてクラスを用意するという目的も果たせなくなります。

4. __init__ メソッドの引数にデフォルト値を指定できますか?

はい、 __init__ メソッドを定義するときに 1 つ以上の属性にデフォルト値を指定できます。デフォルト値を指定すると、コンストラクターでこれらの属性をオプションにするのに役立ちます。コンストラクターでこれらの属性の値を渡さない場合、属性はデフォルト値を取得します。

5. __init__ メソッドの外部で属性を変更できますか?

はい、 __init__ メソッドの外部でいつでも属性の値を更新できます。特定のインスタンスを作成した後、インスタンスに新しい属性を動的に追加することもできます。

結論

このチュートリアルでは、 __init__ メソッドを使用してインスタンス変数の値を初期化する方法を学びました。これは簡単ですが、特に多数の属性がある場合には、繰り返しになる可能性があります。

興味があれば、 データクラス モジュール を調べてください。 Python 3.7 以降では、組み込みデータ クラス モジュールを使用して、データを保存するデータ クラスを作成できます。 __init__ およびその他の一般的に使用されるメソッドのデフォルト実装に加えて。これらには、型ヒント、複雑なデフォルト値、最適化のための優れた機能が多数付属しています。

次に、Python の if __name__==’__main__’ について詳しく学習します。

「 Python の __init__ とは何ですか? 【実例付き】」についてわかりやすく解説!絶対に観るべきベスト2動画

【Python入門⑲】クラスの初期化__init__()を、分かりやすく解説
“__new__ VS __init__” In Python Tutorial (Simplified Explantion)