SORU
13 ŞUBAT 2011, Pazar


Dict anahtarları Python içinde bir öznitelik gibi erişme?

Daha conveniant obj.foo yerine bu kod yazdım obj['foo'], dict anahtarları erişmek için:

class AttributeDict(dict):
    def __getattr__(self, attr):
        return self[attr]
    def __setattr__(self, attr, value):
        self[attr] = value

Ancak, Python kutudan bu işlevsellik sağlamaz bunun bir nedeni olmalı sanırım. Bu şekilde dict anahtarları erişim uyarılar ve tuzaklar ne olurdu?

CEVAP
31 Ocak 2013, PERŞEMBE


Bunu yapmak için en iyi yoldur:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

Bazı artıları:

  • Gerçekten çalışıyor!
  • Hayır sözlük sınıf yöntemleri gölgeli (*6 örneğin;* sadece iyi çalışır)
  • Öznitelikleri ve öğeler her zaman uyumlu
  • Nitelik olarak var olmayan anahtar erişmeye doğru KeyError yerine AttributeError yükseltir

Eksileri:

  • Yeni başlayanlar için mükemmel bir sihir gibi görünüyor.
  • Python memory leak neden&; 2.7.3 / Python3 < 3.2.3 . lt
  • Pylint E1123(unexpected-keyword-arg) E1103(maybe-no-member) ile deliye döner

Bu nasıl çalıştığı hakkında kısa bir açıklama

  • Tüm python nesneleri, DAHİLİ olarak __dict__ adlı bir sözlük öznitelikleri depolar.
  • İç sözlük __dict__ olması gerekir, bu gereksinimi yoktur "sadece düz bir dict iç sözlüğe dict() herhangi bir alt sınıfı atayabiliriz.",
  • Bizim durumumuzda biz sadece başlatmasını __init__ () AttrDict() örneği atayın.
  • super()o zamandan beri işlevi, tüm der. " (zaten) tam bir sözlük gibi davranır emin yaptık __init__() s yöntemini çağırarak ^em>sözlük örneklemekod.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • disneychannel

    disneychanne

    19 ŞUBAT 2006
  • mobilenet.cz

    mobilenet.cz

    26 NİSAN 2008