受け入れられた回答はその場にありますが、少し説明を追加したいと思います。
ちょっと練習しましょう
まず、次のようにクラスを定義します。
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
新しいリストを作成するための組み込み関数です。名前のクラスは大文字で書く必要があります。