SORU
28 Ocak 2011, Cuma


Nasıl Python değişmez bir nesne yapmak için?

Hiç bu kadar ihtiyacım olsa da, sadece Python değişmez bir nesne yapmak biraz zor olabilir, o bana vurdu. Sadece o zaman bile __init__ özniteliklerini ayarlayamazsınız çünkü __setattr__, geçersiz kılabilirsiniz. Bir demet sınıflara ise çalışan bir hile:

class Immutable(tuple):

    def __new__(cls, a, b):
        return tuple.__new__(cls, (a, b))

    @property
    def a(self):
        return self[0]

    @property
    def b(self):
        return self[1]

    def __str__(self):
        return "<Immutable {0}, {1}>".format(self.a, self.b)

    def __setattr__(self, *ignored):
        return NotImplemented

    def __delattr__(self, *ignored):
        return NotImplemented

Ama o self[0] ve sinir bozucu olan, self[1], a b değişkenleri erişebilirsiniz.

Bu Saf Python ile mümkün mü? Nasıl bir C uzantısı ile yapayım?

(Python 3 tek iş bu cevapları kabul edilebilir).

Güncelleme:

O yüzden demet sınıflara iyi [0], [1] vb verilere ek olasılığı dışında çalışan Saf Python, bunu yapmak için bir yoldur. Yani, tam bu soru tüm bu eksik nasıl yapılır bunu "düzgün" C, sanıyorum ki oldukça basit, sadece herhangi bir uygulama geititem setattribute vb. Ama kendim yapmak yerine, tembel olduğum için bunun için bir ödül teklif ediyorum. :)

CEVAP
28 Ocak 2011, Cuma


Ben sadece aklıma başka bir çözüm: orijinal kodu aynı davranışı elde etmek için En kolay yoludur

Immutable = collections.namedtuple("Immutable", ["a", "b"])

Nitelikler [0] vb. yoluyla, bu sorunu çözmüyor ama en azından oldukça kısa ve pickle copy ile uyumlu olması ek avantaj sağlar.

namedtuple Bir tür this answer, yani tuple türetilen ve __slots__ kullanarak tarif ettiğine benzer oluşturur. Python 2.6 veya üzeri.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MagmaRhino

    MagmaRhino

    16 Temmuz 2011
  • natescamp

    natescamp

    30 NİSAN 2009
  • Pocketnow

    Pocketnow

    14 EKİM 2007