Czy można stworzyć obiekt ze słownika w Pythonie w taki sposób, że każdy klucz jest atrybutem tego obiektu?
Coś takiego:
d = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }
e = Employee(d)
print e.name # Oscar
print e.age + 10 # 42
Myślę, że byłoby to odwrotnością tego pytania: słownik Pythona z pól obiektu
python
dictionary
properties
attributes
initialization
OscarRyz
źródło
źródło
def __init__(self,**initial_data)
uzyskasz dodatkową korzyść z posiadania metody init, która może również obsługiwać argumenty słów kluczowych (np. „E = Pracownik (imię = 'Oscar')” lub po prostu weźmiesz słownik (np. „E = Pracownik ( ** dict) ”).Employee(some_dict)
iEmployee(**some_dict)
interfejsów API jest niespójne. Powinno być dostarczone, co jest lepsze.()
zamiastNone
, można zrobić to tak:def __init__(self, iterable=(), **kwargs): self.__dict__.update(iterable, **kwargs)
.[[setattr(self,key,d[key]) for key in d] for d in some_dict]
AddressNotFoundError
(aby zwrócić poprawione dane w tym przypadku, zamiast wysadzać) - uznałem za szalone, że coś tak prostego w PHP ((object) ['x' => 'y']
) wymagało tak dużo okrucieństwa w PythonieUstawianie atrybutów w ten sposób prawie na pewno nie jest najlepszym sposobem rozwiązania problemu. Zarówno:
Wiesz, jakie wszystkie pola powinny być przed czasem. W takim przypadku możesz jawnie ustawić wszystkie atrybuty. To by wyglądało
lub
Nie wiesz, jakie pola powinny być przed czasem. W takim przypadku należy przechowywać dane jako dict, zamiast zanieczyszczać przestrzeń nazw obiektów. Atrybuty służą do dostępu statycznego. Tak by wyglądała ta sprawa
Innym rozwiązaniem, które jest w zasadzie równoważne z przypadkiem 1, jest użycie pliku
collections.namedtuple
. Zobacz odpowiedź van, aby dowiedzieć się, jak to zaimplementować.źródło
Możesz uzyskać dostęp do atrybutów obiektu za pomocą
__dict__
i wywołać na nim metodę update:źródło
__dict__
jest artefaktem implementacji i nie należy go używać. Ponadto ignoruje to istnienie deskryptorów w klasie.__dict__
jest udokumentowaną częścią języka, a nie artefaktem implementacji.setattr
jest lepsze od__dict__
bezpośredniego dostępu . Musisz pamiętać o wielu rzeczach, które mogą prowadzić do__dict__
nieobecności lub nie robienia tego, co chcesz, kiedy używasz__dict__
, alesetattr
są praktycznie identyczne z faktycznym robieniemfoo.bar = baz
.__dict__
odradza się: docs.python.org/tutorial/classes.html#id2Dlaczego nie używać nazw atrybutów jako kluczy do słownika?
Możesz zainicjować za pomocą nazwanych argumentów, listy krotek, słownika lub przypisania poszczególnych atrybutów, np .:
Alternatywnie, zamiast zwiększać błąd atrybutu, możesz zwrócić None dla nieznanych wartości. (Sztuczka używana w klasie pamięci web2py)
źródło
Myślę, że użycie odpowiedzi
settattr
jest najlepszym rozwiązaniem, jeśli naprawdę potrzebujesz wsparciadict
.Ale jeśli
Employee
obiekt jest tylko strukturą, do której można uzyskać dostęp za pomocą składni kropki (.name
) zamiast składni dict (['name']
), możesz użyć namedtuple w następujący sposób:Masz
_asdict()
metodę dostępu do wszystkich właściwości jako słownika, ale nie możesz później dodać dodatkowych atrybutów, tylko podczas konstrukcji.źródło
powiedz na przykład
jeśli chcesz od razu ustawić atrybuty
źródło
a.__dict__.update(x=100, y=300, z="blah")
podobnie jak przy użyciu dict, możesz po prostu użyć kwargs w następujący sposób:
źródło