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

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

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

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

Python

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

Q&A

解決済

3回答

352閲覧

classとインスタンスと変数の関係

poko_poko

総合スコア168

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/02/28 03:03

編集2018/02/28 03:39

pythonでclassを作ってる最中に疑問に思ったので質問です。
クラス変数、インスタンス変数の考え方はこんな感じで良いのでしょうか。

・関数(def)の中でself.を着けない変数は、関数終了時に破棄される
・クラス変数名と、インスタンス変数名が同じ場合、呼び出し元で変数を直接コールする時
インスタンス変数が優先される。

例:

class test1(): class_hensu = 1 def inst1(self): self.class_hensu = 'a' def inst2(self): inst2_hensu = 2 ← selfを付けていないためinst1が終了した時点で破棄される? print(inst2_hensu) if __name__ == '__main__': test = test1() print(test.class_hensu) # クラス変数を表示(1が表示される)   test.inst1() # class_hensuのインスタンス変数を作成 print(test.class_hensu) # インスタンス変数を表示(aが表示される)   test.inst2() # 関数終了時にinst1_hensuは破棄される print(test.inst2_hensu) # 変数が無いためエラーとなる

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

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

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

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

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

KSwordOfHaste

2018/02/28 03:35

インストラクタはインスタンスのtypoでしょうか?
poko_poko

2018/02/28 03:37

頭の中でインスタンスとコンストラクタが混ざってインストラクタと書いてました。ありがとうございます。修正します。
guest

回答3

0

ベストアンサー

関数(def)の中でself.を着けない変数は、関数終了時に破棄される

概ねよいとも言えますが、この表現は不正確かも知れません。self.を付けないというのは「変数名を直接指定してアクセスする場合」という意味と思いますが、そのようにアクセスする変数は「ローカル変数」の場合と「グローバル変数」の場合があります。関数(メソッド)終了時に破棄されるのは「ローカル変数」の方だけです。

Python

1g1 = 1 2g2 = 2 3 4class A: 5 def method1(self): 6 a = 1 # aはmethod1のローカル変数 7 print(g1) # g1はグローバル変数 8 global g2 9 g2 = 3 # g2もグローバル変数

クラス変数名と、インスタンス変数名が同じ場合、呼び出し元で変数を直接コールする時

インスタンス変数が優先される。

ということでよいと思いますが、どちらかといえばクラス変数をクラス外からアクセスするなら、その変数はクラス名を介してアクセスした方がよいのではないかと思いました。わざわざインスタンスを介してクラス変数にアクセスしたいことはあるのでしょうか・・・

class A: def __init__(self): self.x = 1 A.x = 2 A.y = 3 a = A() print(a.x) # 1 (インスタンス変数xが優先されている) print(A.x) # 2 (でもクラス名を指定すればクラス変数の方をアクセスできる) print(a.y) # 3 (同名のインスタンス変数がなければインスタンスを介してクラス変数にアクセスできる) print(A.y) # 3 (でもクラス共通の変数なんだからクラス名でアクセスした方がいいんじゃないかな)

投稿2018/02/28 03:49

編集2018/02/28 05:19
KSwordOfHaste

総合スコア18394

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

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

poko_poko

2018/02/28 06:00

詳しくありがとうございます。 モヤっとしていたところが解決しました。
guest

0

そんな感じで良いと思います。加えるなら、、、

python

1print(test1.class_hensu) # クラス変数(1)が「常に」表示される 2print(test.__class__.class_hensu) # クラス変数(1)が「常に」表示される

でしょうか。

投稿2018/02/28 03:53

YouheiSakurai

総合スコア6142

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

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

poko_poko

2018/02/28 05:59

クラス変数__class__でアクセスできるんですね ありがとうございました。
guest

0

参考情報

  • Pythonのクラス定義とインスタンスの扱い

https://qiita.com/hiroykam/items/51a97b648b4f5eadf3b8

  • Python3入門(7)オブジェクトとクラス

https://itstudio.co/2018/01/17/7455/

投稿2018/02/28 22:07

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問