getattr()
Odczytuje atrybut obiektu po nazwie podanej jako napis, opcjonalnie z wartością domyślną.
- Zwraca
- Wartość atrybutu albo
default.
Przykład
#class Student:
def __init__(self, name, points):
self.name = name
self.points = points
ania = Student("Ania", 250)
print(getattr(ania, "points"))
print(getattr(ania, "level", 1))
for field in ["name", "points"]:
print(field, "=", getattr(ania, field))Definicja i zastosowanie
#Funkcja getattr(obiekt, "nazwa") działa jak zapis obiekt.nazwa, ale nazwę atrybutu podajesz jako napis. Dzięki temu atrybut można wybrać dopiero w czasie działania programu, np. na podstawie danych z pliku, ustawień albo polecenia wpisanego przez użytkownika.
Gdy atrybutu nie ma, getattr() zgłasza AttributeError. Z trzecim argumentem zwraca zamiast tego wartość domyślną, co przydaje się przy polach opcjonalnych. W ten sam sposób odczytasz metodę: getattr(obiekt, "save") zwraca metodę, którą potem wywołujesz nawiasami.
Pokrewne funkcje to hasattr() (czy atrybut istnieje), setattr() (zapis atrybutu po nazwie) i delattr() (usunięcie atrybutu). Nie używaj ich tam, gdzie wystarczy zwykła kropka albo słownik: kod oparty na nazwach zapisanych w napisach trudniej czytać, a edytor nie wychwyci w nim literówek.
Składnia
#getattr(object, name)
getattr(object, name, default)Parametry
#object
dowolny obiekt
Obiekt, z którego odczytujesz atrybut. Może to być też klasa albo moduł.name
str
Nazwa atrybutu lub metody.default
opcjonalny
Wartość zwracana, gdy atrybutu nie ma. Bez niej zgłaszany jestAttributeError.
Więcej przykładów
#class Robot:
def forward(self):
return "Jadę do przodu"
def left(self):
return "Skręcam w lewo"
robot = Robot()
for command in ["forward", "left", "jump"]:
action = getattr(robot, command, None)
print(action() if action else f"Nieznane polecenie: {command}")class Settings:
pass
settings = Settings()
for key, value in {"theme": "dark", "lang": "pl"}.items():
setattr(settings, key, value)
print(settings.theme, settings.lang)
try:
getattr(settings, "font")
except AttributeError as error:
print(error)Dobre praktyki
#- Sięgaj po
getattr()tylko wtedy, gdy nazwa atrybutu naprawdę jest znana dopiero w czasie działania programu. W pozostałych przypadkach piszobiekt.atrybut. - Gdy nazwa metody pochodzi od użytkownika, sprawdź ją z listą dozwolonych poleceń, żeby nie dało się wywołać metody, której nie przewidziałeś.
- Funkcja działa także z modułami:
getattr(math, "sqrt")(16)zwraca4.0.
Powiązane hasła
#- hasattr()Sprawdza, czy obiekt ma atrybut lub metodę o podanej nazwie. Zwraca True albo False.
- dir()Zwraca listę nazw atrybutów i metod obiektu.
- classDefiniuje klasę: szablon obiektów łączący dane i funkcje, które na nich działają.
- selfPierwszy parametr metody: obiekt, na którym metodę wywołano. Daje dostęp do jego atrybutów i innych metod.
- dict.get()Zwraca wartość dla klucza albo wartość domyślną, gdy klucza nie ma w słowniku.
Widzisz błąd albo brakuje przykładu? Napisz do nas.