質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

3回答

1195閲覧

Pythonのclassについて

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2015/05/06 03:19

初期化メソッドについてもやもやしていたんですが、

lang

1class Hoge: 2 def __init__(self, a, b): 3 self.a = a 4 self.b = b

つまりアトリビュートの初期化というのは、

lang

1def hoge(a, b): 2

関数では引数を指定して自動的に呼び出すときに引数の値が初期化されるけど、classでHoge(a, b)のように呼ぶときは__init__メソッドでself.a = a, self.b = bのようにselfをつけてあげないと初期化されないんですか?
つまり関数の引数の初期化は新しく呼ぶたびに自動的に行われるが、classではself.~でアトリビュートをつくらないと初期化されない。、ということでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

貴殿の文章を元に考えて見ましょう。

>関数では引数を指定して自動的に呼び出すときに引数の値が初期化されるけど、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)として定義しておくと便利という風に私は、理解しています。
この説明でよろしいか、先輩方々の回答も頂きたいです。

敬具

投稿2019/10/20 01:24

hit701

総合スコア148

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

classのアトリビュートが省略されているので混乱されているのかと思いますが
毎回初期化しなくとも以下のように動作します。

lang

1class Hoge: 2 a = "hoge" 3 b = "fuga" 4 def __init__(self, a=None, b=None): 5 if a: 6 self.a = a 7 if b: 8 self.b = b 9 10print "Hoge.a =", Hoge.a 11print "Hoge.b =", Hoge.b 12 13o = Hoge("foo", "bar") 14print "instance obj.a = ", o.a 15print "instance obj.b = ", o.b 16 17o = Hoge() 18print "instance obj.a = ", o.a 19print "instance obj.b = ", o.b 20 21# 実行結果 22# Hoge.a = hoge 23# Hoge.b = fuga 24# instance obj.a = foo 25# instance obj.b = bar 26# instance obj.a = hoge 27# instance obj.b = fuga

投稿2015/05/10 01:57

KazuhikoHotta

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どこに引っかかっているのかよくわからないのですが、

lang

1def hoge(a, b): 2 ここで引数の a や b を使うのと、 3 4class Hoge: 5 def __init__(self, a, b): 6 ここで引数の a や b を使うのは全く同じ仕組みです 7 self.a = a 8 self.b = b

引数aとインスタンス変数aの区別が付いていないのであれば、

lang

1def hoge(x, y): 2 ここで引数の x や y を使うのと、 3 4class Hoge: 5 def __init__(self, x, y): 6 ここで引数の x や y を使うのは全く同じ仕組みです 7 self.a = x 8 self.b = y

と書き換えるとどうでしょうか?

投稿2015/05/06 04:11

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問