hasattr()

Sprawdza, czy obiekt ma atrybut lub metodę o podanej nazwie. Zwraca True albo False.

Zwraca
True albo False.
Na tej stronie

Przykład

#
Python
class Quiz:
    def __init__(self):
        self.questions = 5

    def check(self, answer):
        return answer == "B"

quiz = Quiz()

print(hasattr(quiz, "questions"))
print(hasattr(quiz, "check"))
print(hasattr(quiz, "timer"))
print(hasattr("tekst", "upper"), hasattr(42, "upper"))
Wynikzapisany wynik, możesz go sprawdzić
True
True
False
True False

Definicja i zastosowanie

#

Funkcja hasattr(obiekt, "nazwa") zwraca True, jeśli obiekt ma atrybut o tej nazwie, a False w przeciwnym razie. Liczą się atrybuty samego obiektu, jego klasy i klas bazowych, a także metody.

W środku hasattr() po prostu próbuje odczytać atrybut przez getattr() i sprawdza, czy pojawił się AttributeError. Oznacza to, że dla właściwości zdefiniowanej przez @property wykonuje się kod gettera, a inne wyjątki zgłoszone w tym kodzie nie zostaną przechwycone.

Sprawdzanie przez hasattr() przydaje się przy obiektach różnych typów, np. żeby wywołać metodę tylko tam, gdzie istnieje. Takie podejście nazywa się duck typingiem: liczy się to, co obiekt potrafi, a nie jego klasa. Często krótsze jest jednak od razu getattr(obiekt, "nazwa", None) albo blok try z except AttributeError.

Składnia

#
Składnia
hasattr(object, name)

Parametry

#
  • object

    dowolny obiekt

    Sprawdzany obiekt.
  • name

    str

    Nazwa atrybutu lub metody.

Więcej przykładów

#
Duck typing: wywołaj, jeśli metoda istnieje
Python
class Video:
    def play(self):
        return "Odtwarzam wideo"

class Quiz:
    def start(self):
        return "Start quizu"

class Article:
    pass

for item in [Video(), Quiz(), Article()]:
    if hasattr(item, "play"):
        print(item.play())
    elif hasattr(item, "start"):
        print(item.start())
    else:
        print(f"{type(item).__name__}: brak akcji")
Wynikzapisany wynik, możesz go sprawdzić
Odtwarzam wideo
Start quizu
Article: brak akcji
hasattr() uruchamia kod właściwości
Python
class Profile:
    @property
    def avatar(self):
        print("Szukam avatara...")
        raise AttributeError("brak avatara")

profile = Profile()
print(hasattr(profile, "avatar"))
Wynikzapisany wynik, możesz go sprawdzić
Szukam avatara...
False

Dobre praktyki

#
  • Zamiast pary hasattr() i odczytu często wystarczy jedno wywołanie getattr(obiekt, "nazwa", None).
  • Klucze słownika to nie atrybuty. Do sprawdzania, czy klucz istnieje, używaj operatora in.
  • Jeśli liczy się typ obiektu, a nie to, jakie ma metody, użyj isinstance().

Powiązane hasła

#

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