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

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

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

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

Python

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

Q&A

解決済

1回答

1429閲覧

Pythonの関数内でのselfによる変数の定義について

papi_tokei

総合スコア106

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2017/07/04 16:22

###質問の概要
Pythonのselfに関して、少し疑問点が見つかりましたので、
質問させて頂きます。

###該当のソースコード

Python

1class Test: 2 def __init__(self): 3 self.a=1 4 def sample(self): 5 self.c=10 6 print(self.c) 7 def pri(): 8 print(self.c) 9 10test=Test() 11test.sample() 12print(test.a) 13#test.pri() #エラー 14#print(test.c) #エラー

###質問内容
上記のソースコードでsample関数内で、self.cという変数を新しく定義していると思います。
self.cという変数は、sample関数内では普通に使用できています。
ですが、他の関数から使用することは出来ないようです。

ここで質問したいのは、self.cと記述することに特別な意味があるのかということです。
例えば、sample関数の中に、ローカル変数としてcを定義するのと、
self.cとして定義するのとではどう違うのでしょうか?

_init_関数内で定義したself.aは他のメンバ関数でも共通して使えますが、
他の関数(sample関数)でself.cと定義することに意味はあるのでしょうか?

self.cとしても、cと定義した場合でもローカル変数と同じ扱いになっているような気がします。
この二つの定義の違いはあるのでしょうか?

ご教授頂ければ幸いです。
よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
Python3 Wandboxで実行

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

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

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

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

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

guest

回答1

0

ベストアンサー

単にサンプルコードの誤りだと思います。

python

1 def pri(): 2 print(self.c) 3 45 6 def pri(self): 7 print(self.c)

おそらく TypeError: pri() takes 0 positional arguments but 1 was given のようなエラーが出たと思いますが、引数が足りないというメッセージです。なにかエラーで止まった場合は、エラーメッセージを読む(英語がわからなければGoogle翻訳してみる)習慣をつけると理解が進みやすいと思います。


追記:

で本題ですが、self.c = 10 で定義した変数cは インスタンス変数 と呼ばれるものです。これはクラスのインスタンス内でのみアクセスできる変数です。

python

1class Hoge(object): 2 def set_x(self, x): 3 self.x = x 4 5 def print_x(self): 6 print('self.x is ', self.x) 7 8 9a = Hoge() 10a.set_x(123) 11a.print_x() 12 13b = Hoge() 14b.print_x()
# 実行結果 self.x is 123 Traceback (most recent call last): File "hoge.py", line 14, in <module> b.print_x() File "hoge.py", line 6, in print_x print('self.x is', self.x) AttributeError: 'Hoge' object has no attribute 'x'

ですので上記のように同じ Hoge クラスでも、別のインスタンスのインスタンス変数は見えません。

またもう少し広いスコープを持つ クラス変数 というものがあります。

python

1class Hoge(object): 2 y = 2017 3 4 def set_x(self, x): 5 self.x = x 6 7 def print_x(self): 8 print('self.x is', self.x) 9 print('self.y is', self.y) 10 11 12print('Hoge.y is ', Hoge.y) 13 14a = Hoge() 15print('a.y is', a.y) 16a.set_x(123) 17a.print_x()
# 実行結果 Hoge.y is 2017 a.y is 2017 self.x is 123 self.y is 2017

クラスをインスタンス化しなくても直接参照ができますし、各インスタンスの中からも参照可能です。ほかの言語でいう定数の変わりとして使うことが多いです。

投稿2017/07/04 16:37

編集2017/07/05 16:17
miyahan

総合スコア3095

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

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

papi_tokei

2017/07/04 16:49

確認不足でした。 ありがとうございます。 Pythonでは、selfをつけて定義すると、どの関数内でも、共有できる変数になるのですね。 勉強になりました。
miyahan

2017/07/05 16:18

はい、**同じインスタンス(オブジェクト)の** どの関数内でも共有できる変数になります。
papi_tokei

2017/07/05 17:16

クラス変数、インスタンス変数の詳しい説明を追記して頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問