getattr()

Odczytuje atrybut obiektu po nazwie podanej jako napis, opcjonalnie z wartością domyślną.

Zwraca
Wartość atrybutu albo default.
Na tej stronie

Przykład

#
Python
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))
Wynikzapisany wynik, możesz go sprawdzić
250
1
name = Ania
points = 250

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

#
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 jest AttributeError.

Więcej przykładów

#
Wybór metody po nazwie
Python
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}")
Wynikzapisany wynik, możesz go sprawdzić
Jadę do przodu
Skręcam w lewo
Nieznane polecenie: jump
setattr() i brakujący atrybut
Python
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)
Wynikzapisany wynik, możesz go sprawdzić
dark pl
'Settings' object has no attribute 'font'

Dobre praktyki

#
  • Sięgaj po getattr() tylko wtedy, gdy nazwa atrybutu naprawdę jest znana dopiero w czasie działania programu. W pozostałych przypadkach pisz obiekt.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) zwraca 4.0.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.