Kabul edilen anwer açık olmasına rağmen, biraz açıklama eklemek istiyorum.
Küçük bir egzersiz yapalım
her şeyden önce bir sınıfı aşağıdaki gibi tanımlayın:
class A:
temp = 'Skyharbor'
def __init__(self, x):
self.x = x
def change(self, y):
self.temp = y
Peki burada neyimiz var?
tempBir dize niteliği olan çok basit bir sınıfımız var
- Ayarlayan bir
__init__yöntemself.x
- Bir değişiklik yöntemi kümeleri
self.temp
Şimdiye kadar oldukça düz evet? Şimdi bu sınıfla oynamaya başlayalım. Önce bu sınıfı başlatalım:
a = A('Tesseract')
Şimdi aşağıdakileri yapın:
>>> print(a.temp)
Skyharbor
>>> print(A.temp)
Skyharbor
Eh, a.tempbeklendiği gibi çalıştı ama cehennem nasıl yaptığını A.tempişi? İyi çalıştı çünkü temp bir sınıf niteliğidir. Python'daki her şey bir nesnedir. Burada A aynı zamanda bir sınıf nesnesidir type. Bu nedenle temp özniteliği Asınıf tarafından tutulan bir özniteliktir ve temp değerini A(aracılığıyla bir örnekle değil a) değiştirirseniz, değiştirilen değer tüm Asınıf örneğine yansıtılır . Devam edelim ve bunu yapalım:
>>> A.temp = 'Monuments'
>>> print(A.temp)
Monuments
>>> print(a.temp)
Monuments
İlginç değil mi? Ve unutmayın id(a.temp)ve id(A.temp)hala aynı .
Herhangi bir Python nesnesine, __dict__öznitelik listesini içeren bir öznitelik otomatik olarak verilir . Bu sözlüğün örnek nesnelerimiz için neler içerdiğini araştıralım:
>>> print(A.__dict__)
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print(a.__dict__)
{x: 'Tesseract'}
O Not tempniteliği arasında yer almaktadır Aiken sınıfın niteliklerini xörneğin listelenir.
Öyleyse a.temp, örnek için listelenmemiş olsa bile, tanımlı bir değer elde edelim a. Bu __getattribute__()yöntemin büyüsü . Python'da noktalı sözdizimi otomatik olarak bu yöntemi çağırır a.temp, böylece yazdığımızda Python yürütülür a.__getattribute__('temp'). Bu yöntem, özellik arama eylemini gerçekleştirir, yani farklı yerlere bakarak özelliğin değerini bulur.
Standart uygulama __getattribute__()ilk önce bir nesnenin dahili sözlüğünü ( dict ), sonra da nesnenin türünü arar . Bu durumda a.__getattribute__('temp')önce a.__dict__['temp']ve sonraa.__class__.__dict__['temp']
Tamam şimdi changeyöntemimizi kullanalım :
>>> a.change('Intervals')
>>> print(a.temp)
Intervals
>>> print(A.temp)
Monuments
Şimdi kullandık self, print(a.temp)bize farklı bir değer veriyor print(A.temp).
Şimdi karşılaştırırsak id(a.temp)ve id(A.temp)farklı olurlar.
listözellik adı olarak kullanmayın .listyeni bir liste oluşturmak için bir inşa işlevidir. İsim sınıflarını büyük harfle yazmalısınız.