Her şeyden önce A.__dict__.__dict__
farklıdır A.__dict__['__dict__']
ve birincisi yoktur. İkincisi, __dict__
sınıfın örneklerinin sahip olacağı niteliktir. Belirli bir örnek için dahili öznitelik sözlüğünü döndüren bir tanımlayıcı nesnesidir. Kısacası, __dict__
bir nesnenin özniteliği nesnelerin içinde saklanamaz __dict__
, dolayısıyla ona sınıfta tanımlanan bir tanımlayıcı aracılığıyla erişilir.
Bunu anlamak için , tanımlayıcı protokolün belgelerini okumanız gerekir. .
Kısa versiyon:
- Bir sınıf örneği
A
için , ile aynı olan erişim instance.__dict__
sağlanır .A.__dict__['__dict__']
vars(A)['__dict__']
- A sınıfı, erişim için
A.__dict__
sağlanır type.__dict__['__dict__']
ile aynı olan (teorik olarak) vars(type)['__dict__']
.
Uzun versiyon:
Hem sınıflar hem de nesneler, hem öznitelik operatörü (sınıf veya meta sınıflar aracılığıyla uygulanır __getattribute__
) hem de __dict__
tarafından kullanılan öznitelik / protokol aracılığıyla özniteliklere erişim sağlar vars(ob)
.
Normal nesneler için __dict__
nesne dict
, öznitelikleri depolayan ayrı bir nesne oluşturur ve __getattribute__
önce ona erişmeye ve buradan öznitelikleri almaya çalışır (tanımlayıcı protokolü kullanarak sınıfta özniteliği aramaya başlamadan önce ve çağırmadan önce __getattr__
). __dict__
Sınıfına açıklayıcısı bu sözlüğe erişim uygular.
x.name
sırasına göre söz konusu çalışıyor eşdeğerdir: x.__dict__['name']
, type(x).name.__get__(x, type(x))
,type(x).name
x.__dict__
aynı şeyi yapar ancak bariz nedenlerden dolayı ilkini atlar
Bunun için imkansız gibi __dict__
bir instance
saklanacak __dict__
örneğinin, doğrudan yerine açıklayıcı protokolü üzerinden erişilen ve örnek özel bir alanda saklanır.
Sınıflar için de benzer bir senaryo geçerlidir, ancak bunların __dict__
bir sözlük gibi görünen (ancak dahili olarak olmayabilir) ve onu değiştirmenize veya başka bir tanesiyle değiştirmenize izin vermeyen özel bir proxy nesnesidir. Bu proxy, diğerlerinin yanı sıra, kendisine özgü olan ve temellerinden birinde tanımlanmamış bir sınıfın özniteliklerine erişmenizi sağlar.
Varsayılan olarak, vars(cls)
bir boş sınıfın a , dahili olarak kullanılan __dict__
örneklerin özniteliklerini ve sınıfın docstringini depolamak için üç tanımlayıcı taşır . Tanımlarsanız ilk ikisi gitmiş olabilir . O zaman ve nitelikleriniz olmazdı , bunun yerine her yuva için tek bir sınıf niteliğiniz olur. Örneğin öznitelikleri bir sözlükte saklanmayacak ve bunlara erişim sınıftaki ilgili tanımlayıcılar tarafından sağlanacaktır.__weakref__
weakref
__slots__
__dict__
__weakref__
Ve son olarak, A.__dict__
bundan farklı olan tutarsızlık A.__dict__['__dict__']
, özelliğin __dict__
istisnai olarak hiçbir zaman aranmamasıdır vars(A)
, bu yüzden bunun için doğru olan, kullanacağınız diğer herhangi bir özellik için geçerli değildir. Örneğin, A.__weakref__
ile aynı şeydir A.__dict__['__weakref__']
. Bu tutarsızlık olmasaydı, kullanmak A.__dict__
işe yaramazdı ve vars(A)
bunun yerine her zaman kullanmanız gerekirdi .
ive
. En azından bunu daha fazlaA.__dict__['ive']
soru haline