受け入れられた回答はその場にありますが、少し説明を追加したいと思います。
ちょっと練習しましょう
まず、次のようにクラスを定義します。
class A:
temp = 'Skyharbor'
def __init__(self, x):
self.x = x
def change(self, y):
self.temp = y
では、ここには何がありますか?
temp文字列である属性を持つ非常に単純なクラスがあります
__init__設定する方法self.x
- 変更方法セット
self.temp
これまでのところ、かなり簡単です。では、このクラスをいじってみましょう。最初にこのクラスを初期化しましょう:
a = A('Tesseract')
次のようにします。
>>> print(a.temp)
Skyharbor
>>> print(A.temp)
Skyharbor
まあ、a.temp期待どおりに動作しましたが、地獄はどのようにA.temp機能しましたか?tempはクラス属性なので、うまくいきました。Pythonのすべてがオブジェクトです。ここでAもclassのオブジェクトですtype。したがって、属性tempはAクラスが保持する属性であり、tempの値をA(のインスタンスではなくa)変更すると、変更された値はAクラスのすべてのインスタンスに反映されます。先に進んでそれをしましょう:
>>> A.temp = 'Monuments'
>>> print(A.temp)
Monuments
>>> print(a.temp)
Monuments
面白いですね。そして、まだ同じであることに注意してくださいid(a.temp)id(A.temp)。
すべてのPythonオブジェクトには、__dict__属性のリストが含まれる属性が自動的に与えられます。このディクショナリに含まれるオブジェクトの例を調べてみましょう。
>>> print(A.__dict__)
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print(a.__dict__)
{x: 'Tesseract'}
temp属性は、インスタンスに対してリストされている間、Aクラスの属性の中にリストされていることに注意してくださいx。
ではa.temp、インスタンスにリストされていない場合でも、定義された値を取得するのはなぜですかa。まあそれは__getattribute__()メソッドの魔法です。Pythonでは、ドット構文により自動的にこのメソッドが呼び出されるためa.temp、Pythonを実行すると、Pythonが実行されa.__getattribute__('temp')ます。このメソッドは、属性ルックアップアクションを実行します。つまり、さまざまな場所を調べて属性の値を見つけます。
の標準実装は、__getattribute__()最初にオブジェクトの内部辞書(dict)を検索し、次にオブジェクト自体のタイプを検索します。この場合、a.__getattribute__('temp')最初に実行されa.__dict__['temp']、次にa.__class__.__dict__['temp']
では、changeメソッドを使用しましょう。
>>> a.change('Intervals')
>>> print(a.temp)
Intervals
>>> print(A.temp)
Monuments
さてself、使用したので、とprint(a.temp)は異なる値が得られprint(A.temp)ます。
では、とを比較するid(a.temp)とid(A.temp)、それらは異なります。
list属性名として使用しないでください。list新しいリストを作成するための組み込み関数です。名前のクラスは大文字で書く必要があります。