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
Aiç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.namesı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 instancesaklanacak __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