Python で __init__ 関数とパラメーター self を理解して使用するにはどうすればよいですか?
Python を学習したことがある人なら、self と __init__ の構文を知っていますが、丸暗記に頼って無理に理解するのは良い方法ではありません。今日は、__init__ 関数とパラメーター self をどのように理解して使用できるかを見てみましょう。柔軟に対応致します。
要点をまとめると:
クラス class には以下が含まれます。
- クラス属性: クラスに関係する変数。
- クラスメソッド: クラス内の関数。
1. __init__ 関数(メソッド)を理解する
Pythonのクラス定義には__init__関数(メソッド)がよく使われますが、__init__()メソッドの機能や意味はよく理解されていません。
init() メソッドは、次の 2 つの側面で非常に重要です。
① オブジェクトのライフサイクル中に初期化される 各オブジェクトが正しく動作する前に、正しく初期化する必要があります。
② init() パラメータ値はさまざまな形式をとることができます。
__init__ は C# のコンストラクターに似ており、クラス インスタンスが作成された直後に呼び出されます。
class Student:
def __init__(self,number):
self.number=number
def student_number(self):
print('number:',self.number)
student=Student(34)
student.student_number()
ここでは、パラメータ番号と self を持つ __init__ メソッドを定義し、新しいフィールド番号を作成します。
このプロセスでは、データは self.number=number を通じてクラス内にカプセル化され、呼び出しは Student クラスを通じて直接行われます。
1) __init__関数(メソッド)を使用する
2 つのアンダースコアで始まる関数は、プロパティがプライベートであり、クラス外で使用またはアクセスできないことを宣言します。
__init__ 関数 (メソッド) は、パラメーター化されたクラスの初期化をサポートしており、クラスの属性 (クラス内の変数) を宣言するために使用することもできます。
init 関数 (メソッド) の最初のパラメータは self である必要があり (self は慣用的なものです)、後続のパラメータは自由に定義できます。これは関数を定義するのと変わりません。
2) では、なぜ init() メソッドを定義する必要があるのでしょうか? 例を見てみましょう:
init() メソッドを使用してクラスを定義しない場合はどうなりますか?
外周と面積を求める目的で長方形クラスを定義します。
class Rectangle():
def getPeri(self,a,b):
return (a + b)*2
def getArea(self,a,b):
return a*b
rect = Rectangle()
print(rect.getPeri(3,4))
print(rect.getArea(3,4))
print(rect.__dict__)
結果
14
12
{}
上記の例からわかるように、クラス内に init() メソッドを定義していませんが、同様の要件を取得することもでき、その結果、四角形インスタンス rect の周囲長と面積が返されます。
ただし、print(rect.dict) でこのインスタンスの属性を見ると、空であることがわかります。四角形を定義しました。論理的に言えば、その属性は長さと幅でなければなりません。
しかし、そうではないため、init() は定義されていません。
また、オブジェクトをインスタンス化する際、rect = Rectangle() パラメータは空であり、a と b の値は指定されず、関数呼び出し時にのみ指定されます。
また、クラス内で定義されている各メソッドのパラメータには a と b が付いていますが、これは明らかに感情の無駄なので、クラス内で直接メソッドを指定するだけです。
そのため、クラス内に init() メソッドを定義する必要があり、インスタンス作成時にインスタンスに属性をバインドする必要があり、クラス内でメソッド(関数)を定義する際にも便利です。
init() メソッドを使用してクラスを定義する
上記の例を使用してもう一度実行してください
class Rectangle():
def __init__(self,a,b):
self.a = a
self.b = b
def getPeri(self):
return (self.a + self.b)*2
def getArea(self):
return self.a * self.b
rect = Rectangle(3,4)
print(rect.getPeri())
print(rect.getArea())
print(rect.__dict__)
結果
14
12
{'a': 3, 'b': 4}
上記の結果から、init() が定義された後、作成された各インスタンスは独自の属性を持ち、クラス内の関数を直接呼び出すことができることがわかります。