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

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

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

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

Q&A

解決済

2回答

995閲覧

selfとselfしないプロパティー(インスタンス変数?)の違い

nudesudesu

総合スコア8

Python

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

0グッド

0クリップ

投稿2021/07/22 01:25

Python初学者の大学生です。
まだまだ勉強中ですが、オブジェクト指向の便利さに、段々と惹かれて勉強しています。
下記についてselfとselfしないプロパティーの違いが正直まだわかっていないのですが、

class Parent: test= 'test' def __init__(self): self.property = 'property' pass pass

上のようなクラスで作成したインスタンスに対して、_init__の以前で読み込んだtestというインスタンス変数?を出力すると、

print(Parent().test) print(Parent().property) >>test >>property

こちら問題なく出力できました。
一方でクラス属性をvars()で出力すると、下記のようにtestは表示されませんでした。
そしてなぜかdir()では出力されました。

print(vars(Parent())) print(dir(Parent())) {'property': 'property'} ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'property', 'test'] # print(test) # >> NameError: name 'test' is not defined

念ため、testはglobal変数になっているのかと思い、出力してみたらやはりこちらクラス内で定義されたインスタンス変数のようです。
こちら、self.varで定義する変数と定義しない違いはなんなのでしょうか。

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

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

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

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

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

guest

回答2

0

公式チュートリアルのクラスとインスタンス変数を見てください。

投稿2021/07/22 01:35

actorbug

総合スコア2224

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

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

0

ベストアンサー

actorbugさんが書かれているとおり、まず公式ドキュメントを見るべきです。

また、以下の方法で、関数のドキュメント文字列を調べるのは常に役に立つので覚えておいて損はないです。

varsは何をしているか。

python

1>>> print(vars.__doc__) 2vars([object]) -> dictionary 3 4Without arguments, equivalent to locals(). 5With an argument, equivalent to object.__dict__. 6 7>>> print(Parent().__dict__) 8{'property': 'property'}

dirは何をしているか。

python

1>>> print(dir.__doc__) 2dir([object]) -> list of strings 3 4If called without an argument, return the names in the current scope. 5Else, return an alphabetized list of names comprising (some of) the attributes 6of the given object, and of attributes reachable from it. 7If the object supplies a method named __dir__, it will be used; otherwise 8the default dir() logic is used and returns: 9 for a module object: the module's attributes. 10 for a class object: its attributes, and recursively the attributes 11 of its bases. 12 for any other object: its attributes, its class's attributes, and 13 recursively the attributes of its class's base classes.

投稿2021/07/22 01:48

ppaul

総合スコア24666

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

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

nudesudesu

2021/07/22 11:49

ありがとうございます、大変わかりやすかったです! 今後は__doc__でドキュメント確認させていただきます! 一つだけお伺いさせてください! こちら公式ドキュメントで、 https://docs.python.org/ja/3/tutorial/classes.html#class-and-instance-variables class Dog: tricks = [] # mistaken use of a class variable def __init__(self, name): self.name = name def add_trick(self, trick): self.tricks.append(trick) となっているのですが、 こちら self.tricks.a = self.tricks.append(trick)としてなくてもいい理由はなんでしょうか?
ppaul

2021/07/22 11:58

self.tricks.a = self.tricks.append(trick) は、 self.tricks = self.tricks.append(trick) の書き間違いなのでしょうか。 理由は、https://docs.python.org/ja/3/library/stdtypes.html に書かれているように コレクションクラスには、ミュータブルなものがあります。コレクションのメンバをインプレースに足し、引き、または並べ替えて、特定の要素を返さないメソッドは、コレクション自身ではなく None を返します。 だからです。
nudesudesu

2021/07/22 12:34

selfはコレクションなのではしょうか、すみません、上記のリンクにselfに記述がなく自分には理解が難しかったです。
ppaul

2021/07/22 12:39

self.tricks = [] で初期化されたself.tricksはlist型なのでミュータブルなコレクションです。
nudesudesu

2021/07/22 13:00

なるほど、ありがとうございます、、 それでは、どうして クラス外で定義される(global?) a = [] a.append('hoge') # 1 print(a) a = a.append('hoge') #2 print(a) >> [] >> ['hoge'] どうして#1がクラス内で使われているものとは違う結果になるのでしょうか、、 (クラス内だとself.a.append('hoge")だけで#2のような結果を出力できる認識)
ppaul

2021/07/23 02:15

>>> a = [] >>> a.append('hoge') # 1 >>> print(a) ['hoge'] >>> a = a.append('hoge') #2 >>> print(a) None とどこが違うのでしょうか?
nudesudesu

2021/07/23 02:35

クラス外での実行だと a = a.append('hoge') このように=つきで代入しないと値が格納されないのに対して、どうして、 クラス内だと、 a.append('hoge')単体で値が格納されるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問