Python でオブジェクト指向設計を始めてみませんか? Python の __init__ メソッドについて学び、今すぐ最初の一歩を踏み出しましょう。
このチュートリアルでは、Python のクラスとオブジェクトの基本を説明し、次に
__init__
メソッドについて学習します。
このチュートリアルを終了するまでに、次の質問に答えられるようになります。
- インスタンス変数またはインスタンス属性とは何ですか?
- init メソッドはインスタンス属性の初期化にどのように役立ちますか?
- 属性のデフォルト値を設定するにはどうすればよいでしょうか?
- クラスメソッドをコンストラクターとして使用してオブジェクトを作成するにはどうすればよいでしょうか?
始めましょう。

Python のクラスとオブジェクト
クラスは、Python のオブジェクト指向プログラミングの基礎です。クラスを作成し、 属性 と メソッド を定義して、 データ と関連する 機能 をバインドできます。
クラスを作成したら、それをブループリント (またはテンプレート) として使用して、オブジェクト (インスタンス) を作成できます。
👩🏫例です!このクラスのすべてのオブジェクトが次の属性を持つ
Employee
クラスを作成しましょう。
-
full_name
:firstName lastName
形式の従業員のフルネーム -
emp_id
: 従業員ID -
department
: 所属する部門 -
experience
: 経験年数

これはどういう意味ですか? 🤔
個々の従業員は、
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__ メソッドの役割を理解する

オブジェクトをインスタンス化するときにインスタンス変数を初期化できる必要があり、
__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()
クラス メソッドをコンストラクターとして使用して、オブジェクト内でインスタンスを作成できます。辞書からインスタント変数値を取得する必要はありません。
📝 クラス変数に関するメモ
ここでは、個々のインスタンスではなく、クラスにバインドされるクラス メソッドを定義しました。クラスメソッドと同様に、クラス変数を持つこともできます。
クラス メソッドと同様、 クラス変数は インスタンスではなくクラスにバインドされます。属性がクラスのすべてのインスタンスに対して固定値を取る場合、それらをクラス変数として定義することを検討できます。
よくある質問
クラス定義の
__init__
メソッドを使用すると、クラスのすべてのインスタンスの属性またはインスタンス変数を初期化できます。
__init__
メソッドは、クラスの新しいインスタンスが作成されるたびに呼び出されます。
Python クラスに複数の
__init__
メソッドを持たせる目的は、オブジェクトをインスタンス化する複数のコンストラクターを提供することです。ただし、複数の
__init__
メソッドを定義することはできません。複数の
__init__
メソッドを定義した場合、2 番目の最新の実装が最初の実装を上書きします。ただし、
@classmethod
デコレーターを使用して、オブジェクトをインスタンス化するコンストラクターとして使用できるクラス メソッドを定義できます。
__init__
メソッドを定義しない場合でも、オブジェクトをインスタンス化できます。ただし、インスタンス変数を手動で追加し、それぞれに値を割り当てる必要があります。コンストラクターでインスタンス変数の値を渡すことはできませ
ん
。これではエラーが発生しやすいだけでなく、オブジェクトをインスタンス化するためのブループリントとしてクラスを用意するという目的も果たせなくなります。
はい、
__init__
メソッドを定義するときに 1 つ以上の属性にデフォルト値を指定できます。デフォルト値を指定すると、コンストラクターでこれらの属性をオプションにするのに役立ちます。コンストラクターでこれらの属性の値を渡さない場合、属性はデフォルト値を取得します。
はい、
__init__
メソッドの外部でいつでも属性の値を更新できます。特定のインスタンスを作成した後、インスタンスに新しい属性を動的に追加することもできます。
結論
このチュートリアルでは、
__init__
メソッドを使用してインスタンス変数の値を初期化する方法を学びました。これは簡単ですが、特に多数の属性がある場合には、繰り返しになる可能性があります。
興味があれば、
データクラス モジュール
を調べてください。 Python 3.7 以降では、組み込みデータ クラス モジュールを使用して、データを保存するデータ クラスを作成できます。
__init__
およびその他の一般的に使用されるメソッドのデフォルト実装に加えて。これらには、型ヒント、複雑なデフォルト値、最適化のための優れた機能が多数付属しています。
次に、Python の if __name__==’__main__’ について詳しく学習します。