na pytanie:Descriptors jako atrybuty instancji w Pythonie
Dlaczego nie może być instancja deskryptory atrybuty?
to było answered że:
obiekty deskryptora musi żyć w klasie, a nie na przykład
ponieważ jest to sposób, że __getattribute__
jest realizowany.
Prosty przykład. Rozważmy Eurovoc:
class Prop(object):
def __get__(self, obj, objtype=None):
if obj is None:
return self
return obj._value * obj._multiplier
def __set__(self, obj, value):
if obj is None:
return self
obj._value = value
class Obj(object):
val = Prop()
def __init__(self):
self._value = 1
self._multiplier = 0
Rozważmy przypadek, w którym każdy obj ma wiele Prop: czy muszę korzystać z unikatowych nazw do określenia wartości i mnożników (jak here Mając za przykład obiekt deskryptora pozwoliłoby przechowywać. . _multiplier
(a _value
) w samej deskryptorze, upraszczając kilka rzeczy
aby wdrożyć na przykład deskryptora atrybuty trzeba albo:
Zdaję sobie sprawę, że podobne kwestie zostały podniesione wcześniej, ale nie znalazłem prawdziwe wyjaśnienie:
- Dlaczego Python został zaprojektowany w ten sposób?
- Jaki jest sugerowany sposób przechowywania informacji wymaganych przez deskryptor, ale na przykład?
Czy możesz rozszerzyć to, co masz na myśli przez ** orientację obiektu na przerwę **. Po drugie, problemem, który widzę w tym podejściu, jest to, jak zapewnić prosty interfejs API do zmiany mnożnika. Użytkownicy będą musieli zrobić coś w stylu: "obj._multiplier [Obj.val] = 10". Może to być zawinięte w funkcję 'def change_multiplier (self, attr_name, new_value)' ale nie skaluje się ładnie, jeśli 'Prop' ma wiele atrybutów. Coś jak 'def prop (self, attr_name): return self.__dict __ [attr_name] 'może być użyte do zrobienia czegoś takiego jak" obj.prop ('val') .multurek = 10'. – Hernan
@Hernan istnieje typowe założenie, że instancje mają ten sam typ; naruszy to i różne rzeczy się zepsują. Jeśli chodzi o zmianę mnożnika, być może właściwość proxy? - patrz edycja powyżej. – ecatmur
Prawdą jest, że wszystkie instancje nie będą tego samego typu, ale możesz utworzyć podklasy, aby system nadal działał. Jeśli chodzi o pełnomocnika, napisałem coś takiego, ale nie jestem pewien, czy to dobry pomysł. Zasadniczo, 'obj.prop ('val')' zwraca obiekt proxy, który wie o 'obj' i' val'. Gdy wykonujesz polecenie 'obj.prop ('val'), mnożnik = 10' zapisuje do' obj._multiplier [val] = 10'. Po prostu nie jestem pewien, jak to będzie możliwe do utrzymania. – Hernan