In un programma su cui sto lavorando, ho bisogno di fare una notevole quantità di riflessioni in tempo reale al fine di mantenere un elenco di "attributi" conosciuti in tutta la struttura del programma (da utilizzare con una sorta di "assistente di programmazione virtuale" "). Mi è venuto in mente un modo "cheaty" per farlo (di cui sono francamente orgoglioso), che è essenzialmente simile al seguente:
old_getattribute = obj.__getattribute__
def new_getattribute(self, attr):
# various things...
return old_getattribute(attr)
methods = {"__getattribute__" : new_getattribute}
obj.__class__ = type( # Dynamically create a new class
"%s" % obj.__class__.__name__, # whose name is _CLASS
(obj.__class__, ), # which subclasses CLASS
methods) # and uses the new __getattribute__
In sostanza, creo dinamicamente un nuovo tipo che sottoclasse il tipo originale, utilizzando un nuovo metodo __getattribute__
, quindi riassegna l'% interno% co_de dell'oggetto a questo nuovo tipo dinamico.
Per quanto io sia stupito e felice che funzioni (almeno in Python > = 3.6), sono ancora sul punto di usarlo. Nella mia passata programmazione in Python, qualsiasi tipo di modifica dei metodi magici di un oggetto da outside la definizione __class__
dell'oggetto era praticamente proibita, eppure qui sto facendo due volte in modi davvero incasinati.
Vorrei come usarlo, in quanto mi avrebbe risparmiato un sacco di tempo invece di tenere traccia dei singoli oggetti in un modo "appropriato" e quindi controllarli continuamente per le modifiche, ma io voglio per essere sicuro di non creare alcun potenziale pericolo per il resto del programma.
Quindi è quello che sono qui per chiedere. Da un punto di vista dell'architettura del software, quanto potenzialmente pericoloso è questo metodo e quali sono le insidie che potrei incontrare nel farlo funzionare? Sono sicuro che ci sono più di qualche OOP / principi di programmazione generale che sto violando gravemente con questo, ma sono disposto a lasciare che diapositiva se questo può essere "gestito".