貴殿の文章を元に考えて見ましょう。
>関数では引数を指定して自動的に呼び出すときに引数の値が初期化されるけど、classでHoge(a, b)のよう>に呼ぶときはinitメソッドでself.a = a, self.b = bのようにselfをつけてあげないと初期化されないん>ですか?
関数defは、あくまで、関数です。
関数の初期化は、classの初期化とは全く関係がありません。
defの中で、意図的にi=0, j=0などと指定する事ができます。無理して述べますと、これらが、初期化です。
一方、classは、def init(self, a, b)を設定しないと初期化されません。
且つ、明示的に変数を定義できます。(※コンストラクタとも呼びます)
しかし、下記の様にコードを書くとエラーとなります。
python
1
2class Hoge(object):
3
4 def __init__(self, a, b):
5 self.a = a
6 self.b = b
7
8 def hoge(a, b):
9 return a + b #足し算をさせたいとき、ここに何かを書かないとエラーとなります。
10
例えば、下記の通り書くことが出来ます。
python
1class Hoge(object):
2
3 i = 0 #
4 j = 0
5
6 def ab(self):
7 print(self.i, self.j)
8
9
10p = Hoge()
11q = p.ab()
12print(p)
13
でも、変数のi,j共に、クラスの外からi,jを変える事はできません。
従って、次の様に書くことで動作するように取り決められています。
python
1
2class Hoge(object): # ()でもpython3では動きますが、(object)を入れる事が慣例となっています
3
4 def __init__(self, a, b):
5 self.a = a
6 self.b = b
7
8 def hoge(self):
9 # あくまで例です。
10 print(self.a)
11 print(self.b)
12 return self.a + self.b
13
>つまり関数の引数の初期化は新しく呼ぶたびに自動的に行われるが、classではself.~でアトリビュー>トをつくらないと初期化されない。、ということでしょうか
これは、難しい質問ですが、別に関数でもclassの様に作成することは可能です。
しかし、同じコード(メソッド)を何回も書かなくではならないケースが多くなります。
そこで、初期化の話ですが、同じメソッド(hoge)を呼び出す時に、異なる変数でメソッドを呼びたいのに、それぞれの変数を書き換えられないのは避けたいです。
そのため、def init(self, a, b)として定義しておくと便利という風に私は、理解しています。
この説明でよろしいか、先輩方々の回答も頂きたいです。
敬具
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。