Podklasowałem tuple
lub używam namedtuple
błogo na kilka lat, ale teraz mam przypadek użycia, gdzie potrzebuję klasy, która może być używana jako słaby referencyjny. A dzisiaj nauczyłem się tuple
s don't support weak references.niezmienne obiekty w Pythonie, które mogą mieć słabe referencje
Czy istnieje inny sposób na stworzenie niezmiennego obiektu w Pythonie ze stałym zestawem atrybutów? Nie potrzebuję indeksowania numerycznego ani zmiennej szerokości krotki.
class SimpleThingWithMethods(object):
def __init__(self, n, x):
# I just need to store n and x as read-only attributes
... ??? ...
Chyba rodzi się oczywiste pytanie, dlaczego niezmienne; Kod "Pythoniczny" zazwyczaj zakłada po prostu, że wszyscy jesteśmy tutaj dorośli i nikt przy zdrowych zmysłach nie sięgnie do klasy i nie obrzuci jej wartościami, jeśli ryzykuje zrujnowanie niezmienników klasy. W moim przypadku mam zajęcia w bibliotece i martwię się przypadkową modyfikacją obiektów przez użytkowników końcowych. Ludzie, z którymi pracuję, czasami robią niepoprawne założenia dotyczące mojego kodu i zaczynają robić rzeczy, których się nie spodziewałem, więc jest o wiele czystsze, gdybym mógł podnieść błąd, gdyby przypadkowo zmodyfikował mój kod.
Nie martwię się o kuloodporną niezmienność; jeśli ktoś naprawdę nikczemny chce iść i modyfikować rzeczy, ok, w porządku, oni są sami. Po prostu chcę, aby trudno było przypadkowo zmodyfikować moje obiekty.
Co jest nie tak z obejściem sugerowanym przez Raymonda (w mailu)? – Elazar
", aby utworzyć niestandardową klasę z relacją has-a, a nie relacją is-a."- (1) Chcę to zrobić w czystym Pythonie, (2), ma-a oznacza, że klasa niestandardowa zawiera moją prawdziwą klasę, ale wtedy klasa niestandardowa nie jest niezmienna z powodu kurczaków i jaj - gdybym mógł stworzyć niezmienną klasę, to po prostu bym to zrobił –
Domyślam się, że mógłbym użyć klasy kontenerowej, która przesłania '__eq__' i' __hash__' i deleguje do zawartego obiektu .Nie jest pewne, że działałoby to jednak dla słabych wierszy .. –