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

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

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

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

Q&A

解決済

2回答

560閲覧

クラス変数が分かりません Python3

robomoco

総合スコア31

Python 3.x

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

0グッド

0クリップ

投稿2019/08/19 13:32

クラス変数の挙動がよく分かりません。

まず下のコードをシェル上で実行します。

python3

1class Fruit: 2 num = 0 3 def __init__(self,name): 4 self.name = name 5f1 = Fruit("Orange") 6f2 = Fruit("Apple")

次に

Fruit.num = 100

すると,

f1.num

100

f2.num

100
となりました。
ここまでは,理解できます。クラス変数はインスタンスオブジェクトで共有されると本に書いてありましたから。
次からが問題です。

f1.num=20

としても,

Fruit.num

100

f2.num

100
となって,共有されているはずなのに値が変わりません。
さらに,

Fruit.num=50と変更しても
f1.num

20
のままです。f2については

f2.num

50
と変わるのですが。

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

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

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

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

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

guest

回答2

0

下記を実行してみてください。

Python

1vars(f1) #{'name': 'Orange', 'num': 20} 2vars(f2) #{'name': 'Apple'}

f1に「'num': 20」が生成されています。
これは「f1.num=20」を実行したことにより、インスタンス変数が出来てしまったのです。
クラス変数にアクセスする際は、インスタンスからはアクセスしないほうが良いです。

投稿2019/08/19 14:02

meg_

総合スコア10577

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

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

0

ベストアンサー

f1.numを編集してもFruit.numおよびf2.numが変わらなかったのは、f1にnumと言うインスタンス変数が作成されたためです。
また、Fruit.numを編集してもf1.numが変わらなかったのはクラス変数が同名のインスタンス変数でラップされていたためです。

f1.num=20と言う記述で変数に値を代入した場合、pythonではf1インスタンスにnumと言うインスタンス変数が作成されます。例として、f1.hoge=100などと宣言してみてください。特にエラーにならず、f1.hogeと言う変数にアクセスできるはずです。この時、インスタンスf1にはhogeと言うインスタンス変数が作成されています。
また、pythonの挙動として、同名のインスタンス変数とクラス変数が定義されている場合、インスタンス変数が優先されます。このため、クラス変数のnumを編集しても、すでにインスタンス変数のnumが存在しているf1ではインスタンス変数の方が優先される結果になりました。

投稿2019/08/19 13:50

uS_aito

総合スコア145

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

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

robomoco

2019/08/19 14:14

(インスタンス名).(変数名)=数値 で,インスタンス変数が作成できることを初めて知りました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問