CodeGym /Kursy /Python SELF PL /Sprawdzanie typów

Sprawdzanie typów

Python SELF PL
Poziom 16 , Lekcja 3
Dostępny

9.1 Funkcja type()

W Pythonie mamy kilka wbudowanych funkcji do sprawdzania typów i klas obiektów. Te funkcje przydają się do pisania elastycznego i bezpiecznego kodu, który może działać z różnymi typami danych.

Poniżej opowiem Wam o najpopularniejszych z nich: type(), isinstance(), issubclass(), a także o funkcjach do adnotacji typów, takich jak getattr() i hasattr().

Funkcja type()

Funkcja type() zwraca typ obiektu. Pewnie już z nią pracowaliście, prawda?


x = 10
print(type(x))  # Wyjście: <class 'int'>

Ale czego pewnie nie wiecie, to że za jej pomocą można tworzyć nowe klasy!

Tworzenie nowej klasy

Jeśli podamy jej trzy argumenty, to stworzy nowy typ (klasę).

Sygnatura tej operacji:


type(name, bases, dict)

gdzie:

  • name — nazwa tworzonej klasy (łańcuch znaków).
  • bases — krotka klas bazowych (rodziców), od których dziedziczy nowa klasa.
  • dict — słownik zawierający atrybuty i metody nowej klasy.

Tworzenie prostej klasy:


MyClass = type('MyClass', (), {'say_hello': lambda self: print("Hello!")})

# Tworzymy instancję klasy
instance = MyClass()
instance.say_hello()  # Wyjście: Hello!

Można nawet stworzyć coś bardziej skomplikowanego:


MyClass = type('MyClass', (), {
    'attribute': 42,
    '__init__': lambda self, value: setattr(self, 'value', value),
    'display_value': lambda self: print(self.value)
})
            
# Tworzymy instancję klasy
instance = MyClass(10)
print(instance.attribute)  # Wyjście: 42
instance.display_value()  # Wyjście: 10

Tak więc teraz możecie nie tylko określić typ obiektu, ale i stworzyć klasę, stworzyć jej obiekty, a następnie określić ich typy.

9.2 Funkcja isinstance()

Funkcja isinstance() jest wbudowaną funkcją w Pythonie, używaną do sprawdzania, czy obiekt jest instancją określonej klasy lub krotki klas. Zwraca True, jeśli obiekt jest instancją podanej klasy lub którejkolwiek z podanych klas w krotce, oraz False w przeciwnym razie.

Sygnatura i parametry:


isinstance(object, classinfo)

gdzie:

  • object — obiekt, którego przynależność do klasy lub klas należy sprawdzić.
  • classinfo — klasa, typ lub krotka klas i typów, względem których będzie sprawdzany obiekt.

Przykłady użycia:

Sprawdzenie przynależności do jednej klasy


x = 10
print(isinstance(x, int))  # Wyjście: True
            
y = "Hello"
print(isinstance(y, str))  # Wyjście: True

Sprawdzenie przynależności do kilku klas — którejkolwiek


x = 10
print(isinstance(x, (int, float)))  # Wyjście: True
            
y = "Hello"
print(isinstance(y, (int, str)))  # Wyjście: True
            
z = 3.14
print(isinstance(z, (int, str)))  # Wyjście: False

Sprawdzenie przynależności do klas użytkownika


class Animal:
    pass
        
class Dog(Animal):
    pass
        
dog = Dog()
        
print(isinstance(dog, Dog))  # Wyjście: True
print(isinstance(dog, Animal))  # Wyjście: True

W odróżnieniu od bezpośredniego porównania typów za pomocą type(), isinstance() poprawnie działa z dziedziczeniem, sprawdzając przynależność obiektu do którejkolwiek klasy w hierarchii.

9.3 Funkcja issubclass()

Funkcja issubclass() jest wbudowaną funkcją w Pythonie, która służy do sprawdzania, czy podana klasa jest podklasą innej klasy lub którejkolwiek z klas w krotce. Ta funkcja zwraca True, jeśli pierwszy argument faktycznie jest podklasą drugiego, oraz False w przeciwnym razie.

Sygnatura i parametry:


issubclass(class, classinfo)

gdzie:

  • class — klasa, której przynależność do klasy lub klas należy sprawdzić.
  • classinfo — klasa, typ lub krotka klas i typów, względem których będzie sprawdzany pierwszy argument.

Przykłady użycia:

Sprawdzenie przynależności do jednej klasy



class Animal:
    pass
         
class Dog(Animal):
    pass
        
print(issubclass(Dog, Animal))  # Wyjście: True
print(issubclass(Animal, Dog))  # Wyjście: False 

Sprawdzenie przynależności do kilku klas — którejkolwiek


class Animal:
    pass
        
class Dog(Animal):
    pass
        
class Cat(Animal):
    pass
        
print(issubclass(Dog, (Animal, Cat)))  # Wyjście: True
print(issubclass(Dog, (Cat,)))  # Wyjście: False

Przykłady z klasami użytkownika

Dziedziczenie od klas wbudowanych


class MyInt(int):
    pass
        
print(issubclass(MyInt, int))  # Wyjście: True
print(issubclass(int, MyInt))  # Wyjście: False

Hierarchia dziedziczenia


class A:
    pass
        
class B(A):
    pass
        
class C(B):
    pass
        
print(issubclass(C, A))  # Wyjście: True
print(issubclass(C, B))  # Wyjście: True
print(issubclass(B, A))  # Wyjście: True
print(issubclass(A, C))  # Wyjście: False

Zalety korzystania z issubclass()

Sprawdzenie hierarchii klas: issubclass() pozwala sprawdzić hierarchię klas, co jest przydatne do zapewnienia poprawności dziedziczenia i struktury kodu.

Elastyczność: Funkcja wspiera sprawdzanie jednej klasy lub krotki klas, co czyni ją elastyczną do użycia w różnych scenariuszach.

Wygoda dla metaprogramowania: issubclass() jest często używana w metaprogramowaniu i przy pisaniu kodu, który działa z dynamicznymi typami i klasami. O tym jeszcze z Wami porozmawiam, ale nie tak prędko :)

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION