getattr
jest wbudowaną funkcją pobierającą (przynajmniej) dwa argumenty: obiekt, z którego uzyskujesz atrybut, oraz nazwę ciągu atrybutu.
Jeśli nazwa ciąg jest stały, powiedzmy 'foo'
, getattr(obj, 'foo')
jest dokładnie to samo jak obj.foo
.
Głównym powodem użycia wbudowanej funkcji getattr
jest brak nazwy atrybutu jako stałej, ale raczej jako zmiennej. Drugim ważnym przypadkiem użycia jest przekazanie trzy argumentów, a nie tylko dwa: w takim przypadku, jeśli atrybut nie występuje w obiekcie, getattr
zwraca trzeci, "domyślny", argument zamiast podnosić wyjątek.
__getattr__
jest specjalny sposób, zdefiniowane w klasie, która zostanie wywołana, gdy niektóre cechą na przykład tej klasy jest wymagane, i inne zwykłe sposoby dostarczają tego atrybutu (poprzez instancji __dict__
szczeliny, właściwości, a więc on) wszystko nie powiodło się. Możesz go zdefiniować, na przykład, kiedy chcesz przekazać inne, niezdefiniowane odnośniki do innych obiektów.
Twój drugi przykład jest nieprawidłowy, ponieważ wbudowane getattr
można nigdy nie być wywoływane z jednym argumentem.
Trzeci nie powiedzie się, ponieważ słownik, z którego próbujesz "uzyskać atrybut", nie ma tego atrybutu - ma pozycji, które są całkowicie rozłączne z atrybutów oczywiście.
możliwy duplikat [Zrozumienie różnicy między \ _ \ _ getattr \ _ \ _ i \ _ \ _ getattribute \ _ \ _] (http://stackoverflow.com/questions/4295678/understanding-the-difference-between- getattr-and-getattribute) – Trilarion
@Trilarion, który nie jest prawidłowym duplikatem tego pytania –