Python3.8.5でのクラスの初期化とインスタンス変数について。
class Ca(object): #Caクラスの定義
#クラスの初期化(インスタンス変数self.bbの作成)
def __init__(self, a='名無しさん'): #インスタンスを生成したら勝手に実行されるメソッド
self.bb = a #この変数名をself.〇〇とすることで他のメソッドでも呼び出せる
#メソッド①
def fa1(self):
print('こんにちは{}さん'. format(self.bb)) #self.〇〇なのでこのメソッドでもself.bbを呼び出せる
self.fa2() #fa2メソッドの処理を呼び出せる
#メソッド②
def fa2(self): #このスクリプトだとここの引数はべつにselfじゃなくてもいい
print('今日はいい天気ですね。')
#実行
ca = Ca('ボブ') #引数aに入れるパラメータ
ca.fa1() #こんにちはボブさん\n今日はいい天気ですね。
クラスの初期化は def __init__(self): の部分です。
この記述の部分の処理は、Caクラスのインスタンスを作成するだけで強制的に実行されます。
初期化の引数にselfと記述していますが、これは他のaaaとかnameとかのオリジナル変数名とは違い、特殊なあつかいの変数となっています。
このselfは自身へのアクセスを意味しており、このselfをコロンで区切って変数名を付けることで同クラス内の他のメソッドでもその値にアクセスできるようになります。
上記のスクリプトでは、クラスの初期化の部分で第2引数であるaの値をself.bbという名前の変数に代入しています。
このメソッド内に定義された self.〇〇 という変数が、インスタンス変数と言われる変数です。
〇フィールドについて
Pythonのクラスにはフィールドとメソッドが定義できます。
フィールドとはメンバ変数のことであり、別の言い方をするとクラス内で定義されたデータのことです。
つまり、PHPでいうところのプロパティですね。
そしてこのフィールドの中に、さらにインスタンス変数とクラス変数という分類があります。
〇インスタンス変数とクラス変数について
クラスのフィールドにはクラス変数とインスタンス変数の2種類があります。
クラス変数はself.を付けずに変数名を決めた変数です。
メソッドからクラス変数にアクセスするには、クラス名.クラス変数名 と記述する必要があります。
インスタンス変数はself.を付けて変数名を決めた変数です。
メソッドからインスタンス変数にアクセスするには、self.インスタンス変数名 と記述する必要があります。
閑話休題。
上記スクリプトのself.bbは__init__メソッド内で定義された変数なので、通常であれば他のメソッドからアクセスすることはできません。
しかしself.bbは名前から分かるとおりのインスタンス変数なので、関数のパラメータ等に self.bb と記述することで、他のメソッドからでもself.bb にアクセスすることができてしまいます。
ちなみにこのような処理は変数だけでなく、メソッドに対してもおこなうことができます。
たとえば上記スクリプトでは、self.fa2() と記述することでfa1メソッド内でfa2メソッドを呼び出しています。
これはselfを使うことで、「自クラス内にあるfa2という名前のメソッド」を指定しているわけです。
ちなみにPythonのソースコードでは、通常はクラスの第1引数にはselfを記述して、そのselfの中に別に用意した第2引数の値などを代入して使っていくそうです。
とってもややこしいですね。
以上です。