Si consideri il seguente codice:Add attributo classe Python
class Foo():
pass
Foo.entries = dict()
a = Foo()
a.entries['1'] = 1
b = Foo()
b.entries['3'] = 3
print(a.entries)
questo stampa:
{'1': 1, '3': 3}
perché le voci si aggiunge come attributo statico. Esiste un modo per applicare patch alla definizione della classe per aggiungere nuovi attributi (senza utilizzare l'ereditarietà).
sono riuscito a trovare il modo seguente ma sembra contorto a me:
def patch_me(target, field, value):
def func(self):
if not hasattr(self, '__' + field):
setattr(self, '__' + field, value())
return getattr(self, '__' + field)
setattr(target, field, property(func))
patch_me(Foo, 'entries', dict)
Stai aggiungendo un * attributo di classe *, che è condiviso tra tutte le istanze. Se lo aggiungi alle istanze, le istanze * già create * avranno il nuovo attributo? – jonrsharpe
Perché non puoi fare 'a.entries = {'1': 1}' invece? – Vincent