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?
temp
Bir 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.temp
beklendiği gibi çalıştı ama cehennem nasıl yaptığını A.temp
iş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 A
sı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 A
sı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 temp
niteliği arasında yer almaktadır A
iken 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 change
yö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 .list
yeni bir liste oluşturmak için bir inşa işlevidir. İsim sınıflarını büyük harfle yazmalısınız.