hasattr()
Sprawdza, czy obiekt ma atrybut lub metodę o podanej nazwie. Zwraca True albo False.
- Zwraca
TruealboFalse.
Przykład
#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"))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
#hasattr(object, name)Parametry
#object
dowolny obiekt
Sprawdzany obiekt.name
str
Nazwa atrybutu lub metody.
Więcej przykładów
#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")class Profile:
@property
def avatar(self):
print("Szukam avatara...")
raise AttributeError("brak avatara")
profile = Profile()
print(hasattr(profile, "avatar"))Dobre praktyki
#- Zamiast pary
hasattr()i odczytu często wystarczy jedno wywołaniegetattr(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
#- getattr()Odczytuje atrybut obiektu po nazwie podanej jako napis, opcjonalnie z wartością domyślną.
- isinstance()Sprawdza, czy obiekt jest danego typu lub jego podtypu.
- dir()Zwraca listę nazw atrybutów i metod obiektu.
- @propertyZamienia metodę w atrybut: wartość jest wyliczana przy odczycie, a opcjonalny setter kontroluje zapis.
- type()Zwraca typ obiektu.
Widzisz błąd albo brakuje przykładu? Napisz do nas.