🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Python

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

Q&A

解決済

2回答

824閲覧

selfを用いたクラス変数とインスタンス変数へのアクセスについて

ruuuu

総合スコア176

Python 3.x

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Python

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

0グッド

0クリップ

投稿2020/01/06 08:46

クラス変数についてお聞きしたいことがございます。
クラス変数にアクセスする場合、以下コードのように「self.属性名」といった形で、アクセス可能かと思います。
しかし、疑問点があるのですが、こちらの形では、「インスタンス変数」にアクセスを行う場合も、「self.属性名」として、アクセスを行うかと思います。こちら同じ方法で、クラス変数とインスタンス変数にアクセスしているのですが、クラス変数として既に宣言されていた場合は、selfはクラス変数を指し、そうでない場合は、インスタンス変数を指す、といった感じなのでしょうか?
同様の方法でアクセスが可能といった点で、少々疑問でして質問させて貰いました。

class GirlFriend: min_intimacy = 0 max_intimacy = 100 def set_intimacy(self, new_intimacy): if not ( self.min_intimacy <= new_intimacy <= self.max_intimacy ): raise Exception self.intimacy = new_intimacy girl_friend = GirlFriend() girl_friend.set_intimacy(50) girl_friend.set_intimacy(101)

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

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

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

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

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

guest

回答2

0

ベストアンサー

宣言の有無は特に関係なく、動的に名前解決が行われます。

インスタンス変数(属性名)が存在すれば、クラス変数の有無に関わらずインスタンス変数が参照されます。

インスタンス変数が存在せず、クラス変数が存在する場合、参照の場合はクラス変数を参照できます。代入を行うとクラス変数とは独立に新たなインスタンス変数が作られます。


実際はselfからクラス変数にアクセスするコードは可読性などの面で問題があると考えます。type(self).属性名などで明示的に書くべきでは?

参考:
3. データモデル — Python 3.8.1 ドキュメント
Python の属性 - クラス変数とインスタンス変数ってなに? | 民主主義に乾杯

投稿2020/01/06 09:11

hayataka2049

総合スコア30935

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

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

ruuuu

2020/01/06 09:30

ご回答ありがとうございます。 > インスタンス変数が存在せず、クラス変数が存在する場合、参照の場合はクラス変数を参照できます やはりそうだったのですね。しかし、自分もここら辺は混乱するかなと思った為、「self」での参照は避ける方向で考えていきたいと思います。 > type(self).属性名 こちらなのですが、「GirlFriend.min_intimacy」といったように、クラス名を指定し参照する方法でも問題はないと考えられますでしょうか?
hayataka2049

2020/01/06 09:31

>こちらなのですが、「GirlFriend.min_intimacy」といったように、クラス名を指定し参照する方法でも問題はないと考えられますでしょうか? 継承を考えないなら同じですが、継承されたときには問題になるのでは。
ruuuu

2020/01/06 09:41

ご返信ありがとうございます。 お手数をかけ申し訳ないのですが、GirlFriendクラスが継承された場合、どのような問題が発生するか教えて頂けませんでしょうか...?
hayataka2049

2020/01/06 10:15

Aクラスとそのクラス変数A.hoge、Aクラスを継承したBクラスとそのクラス変数B.hogeを考えます。 Bクラス側のメソッドなどでtype(self).hoge = ほげとか書いてあったときはB.hogeに対する変更になりますが、A.hoge = ほげのときはどうなるでしょうか。どちらが実現したい動作でしょうか。
ruuuu

2020/01/06 10:26

>A.hoge = ほげのときはどうなるでしょうか。 こちら、スーパークラス(Aクラス)の「hoge」に対して、「ほげ」が設定されてしまうと思います。 確かにそうなりますと、Bクラスのhogeに対しては値が設定出来ないという問題が生じますね...
guest

0

インスタンスに変数がなければ、クラスを探しに行きます。
関数での変数スコープと似た関係。

py

1>>> a = 123 2>>> b = 456 3>>> def f(): 4... a = 789 5... print(a) 6... print(b) 7... 8>>> f() 9789 10456

投稿2020/01/06 08:56

編集2020/01/06 09:29
shiracamus

総合スコア5406

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

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

ruuuu

2020/01/06 09:19

ご回答ありがとうございます。 >関数での変数スコープと同じ関係。 そうだったのですね。。Pythonの基礎的な部分が抜けている為、きちんと基礎の部分から学んだ方が良い気がしてきました...
shiracamus

2020/01/06 09:29

「同じ関係」は言い過ぎでした。「似た関係」に訂正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問