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 :)
GO TO FULL VERSION