Mam klasę, która pompuje obiekty z wierszy znalezionych w bazie danych (lub innym źródle, np. MongoDB, plik CSV itp.). Aby ustawić właściwości obiektu, robi coś takiego jak self.__dict__.update(**properties)
lub obj.__dict__.update(**properties)
.
Czy to uważa się za Python? Czy to dobry wzorzec, którego powinienem nadal używać, czy też jest to uważana za zła forma?
Odpowiedzi:
W Pythonie 3.3 dodano nowy typ
types.SimpleNamespace()
, aw dokumentacji opisano to w następujący sposób:Zwróć uwagę na
__init__
metodę typu; nie można uzyskać lepszego poparcia tej techniki niż dokumentacja Python.źródło
SimpleNamespace
różni się od większości typów tym, że nie ma ustalonego zestawu atrybutów.__dict__
. Jest to słownik zawierający tabelę symboli modułu. Modyfikacja tego słownika faktycznie zmieni symbol modułu tabeli, ale bezpośrednie przypisanie do__dict__
atrybutu nie jest możliwe (możesz napisaćm.__dict__['a'] = 1
, która określa wartośćm.a
1, ale nie możeszwritem.__dict__ = {}
). Modyfikacja__dict__
bezpośrednia nie jest zalecana ”, co początkowo skłoniło mnie do zadania tego pytania.globals()
Zwraca samej przestrzeni nazw, a są zazwyczaj lepsze sposoby na rozwiązanie problemów niż ustawienie globalnych dynamicznie, stąd ostrzeżenie.