questo è probabilmente un problema semplice, quindi speriamo sia facile per qualcuno segnalare il mio errore o se è possibile.getattr e setattr su oggetti annidati?
Ho un oggetto che ha più oggetti come proprietà. Voglio essere in grado di impostare dinamicamente le proprietà di questi oggetti in questo modo:
class Person(object):
def __init__(self):
self.pet = Pet()
self.residence = Residence()
class Pet(object):
def __init__(self,name='Fido',species='Dog'):
self.name = name
self.species = species
class Residence(object):
def __init__(self,type='House',sqft=None):
self.type = type
self.sqft=sqft
if __name__=='__main__':
p=Person()
setattr(p,'pet.name','Sparky')
setattr(p,'residence.type','Apartment')
print p.__dict__
L'output è:
{ 'pet': < principale .pet oggetto in 0x10c5ec050>, 'residenza' : < principale oggetto .Residence a 0x10c5ec0d0>, 'pet.name': 'Sparky', 'residence.type': 'Apartment'}
Come si può vedere, piuttosto che avere l'attributo name impostato sul oggetto domestico della persona, un nuovo attributo "pet.name" è crea ted.
Non riesco a specificare person.pet su setattr perché diversi oggetti figlio verranno impostati con lo stesso metodo, che sta analizzando del testo e compilando gli attributi dell'oggetto se/quando viene trovata una chiave pertinente.
Esiste un modo facile/integrato per raggiungere questo obiettivo?
O forse ho bisogno di scrivere una funzione ricorsiva per analizzare la stringa e chiamare getattr più volte finché non viene trovato l'oggetto figlio necessario e quindi chiamare setattr su quell'oggetto trovato?
Grazie!
Wow era qualcosa che non sapevo. –
Grazie per la risposta! Questo è bello, mi piace come puoi fare in 5 righe quello che mi ha portato 30. Soluzione molto ordinata e concisa! – TPB
Bella risposta! –