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
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.
Nasıl bir Python nesne olup olmadığını...
Nasıl Python betiği tek başına HERHANG...
Nasıl pip-yüklenebilir yapmak için bir...
Nasıl python yorumlayıcısı yapmak doğr...
Nasıl Python nesne türü karşılaştırmak...