Alla domanda:descrittori come attributi esempio in python
Perché non può essere descrittori attributi esempio?
è stato answered che:
oggetti descrittori ha bisogno di vivere nella classe, non nel caso
perché questo è il modo in cui il __getattribute__
è implementato.
Un semplice esempio. Si consideri un descrittore:
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
Si consideri il caso in cui ogni obj ha Prop multipla: avrei bisogno di usare nomi univoci per identificare i valori e moltiplicatori (come here Avere un oggetto descrittore per esempio permetterebbe di memorizzare il. . _multiplier
(e la _value
) nel descrittore di per sé, semplificando alcune cose
per attuare per descrittore esempio gli attributi è necessario uno:
- per creare un'istanza di classe 012.
- esclusione
__getattribute__
See here
Sono consapevole del fatto che le questioni analoghe sono state sollevate prima, ma non ho trovato una vera e propria spiegazione:
- Perché Python è stato progettato in questo modo?
- Qual è il modo suggerito per archiviare le informazioni che il descrittore necessita ma è per istanza?
Puoi espandere ciò che intendi per ** break object orientation **. In secondo luogo, il problema che vedo con questo approccio è come fornire una semplice API per modificare il moltiplicatore. Gli utenti dovranno fare qualcosa come "obj._multiplier [Obj.val] = 10'. Questo può essere racchiuso in una funzione 'def change_multiplier (self, attr_name, new_value)' ma non si adatta bene se 'Prop' ha attributi multipli. Qualcosa come "def prop (self, attr_name): return self.__dict __ [attr_name] 'potrebbe essere usato per fare qualcosa come' obj.prop ('val'). moltiplicatore = 10'. – Hernan
@Hernan c'è una solita ipotesi che le istanze abbiano lo stesso tipo; violare ciò e varie cose si romperanno. Per quanto riguarda la modifica del moltiplicatore, forse una proprietà proxy? - vedi modifica sopra. – ecatmur
È vero che tutte le istanze non saranno dello stesso tipo, ma potresti creare sottoclassi in modo che isinstance funzioni ancora. Per quanto riguarda il proxy, ho scritto qualcosa del genere ma non sono sicuro che sia una buona idea. Fondamentalmente, 'obj.prop ('val')' restituisce un oggetto proxy che conosce 'obj' e 'val'. Quando si esegue 'obj.prop ('val'). Moltiplicatore = 10' scrive in' obj._multiplier [val] = 10'. Non sono sicuro di quanto sarà mantenibile. – Hernan