diff --git a/python-isinstance/README.md b/python-isinstance/README.md new file mode 100644 index 0000000000..a82e510221 --- /dev/null +++ b/python-isinstance/README.md @@ -0,0 +1,7 @@ +# What Does isinstance() Do in Python? + +This folder provides the code examples for the Real Python tutorial [What Does isinstance() Do in Python?](https://realpython.com/what-does-isinstance-do-in-python/). + +The `.py` files contain the code found in the tutorial. + +When setting up your tutorial environment, make sure `balls.py`, `balls_v2.py`, and `player_iterables.py` are in your program folder. You'll need to import content from these to replicate the tutorial examples. diff --git a/python-isinstance/abstract_class_failure.py b/python-isinstance/abstract_class_failure.py new file mode 100644 index 0000000000..4d09a21610 --- /dev/null +++ b/python-isinstance/abstract_class_failure.py @@ -0,0 +1,3 @@ +from balls_v2 import Ball + +test_ball = Ball("white", "sphere") diff --git a/python-isinstance/ball_instance_test.py b/python-isinstance/ball_instance_test.py new file mode 100644 index 0000000000..4d8b88c453 --- /dev/null +++ b/python-isinstance/ball_instance_test.py @@ -0,0 +1,14 @@ +from balls import AmericanFootBall, Ball, PoolBall + +eight_ball = PoolBall("black", 8) +football = AmericanFootBall("brown") +ball = Ball("green", "sphere") + +isinstance(eight_ball, PoolBall) +isinstance(eight_ball, Ball) +isinstance(eight_ball, AmericanFootBall) + +isinstance(eight_ball, object) +isinstance(football, object) +isinstance(ball, object) +isinstance(object, object) diff --git a/python-isinstance/balls.py b/python-isinstance/balls.py new file mode 100644 index 0000000000..e1c0ccf847 --- /dev/null +++ b/python-isinstance/balls.py @@ -0,0 +1,15 @@ +class Ball: + def __init__(self, color, shape): + self.color = color + self.shape = shape + + +class PoolBall(Ball): + def __init__(self, color, number): + super().__init__(color, shape="sphere") + self.number = number + + +class AmericanFootBall(Ball): + def __init__(self, color): + super().__init__(color, shape="prolate spheroid") diff --git a/python-isinstance/balls_v2.py b/python-isinstance/balls_v2.py new file mode 100644 index 0000000000..2b02b63b42 --- /dev/null +++ b/python-isinstance/balls_v2.py @@ -0,0 +1,30 @@ +from abc import ABC, abstractmethod + + +class Ball(ABC): + def __init__(self, color, shape): + self.color = color + self.shape = shape + + @abstractmethod + def get_state(self): + pass + + +class PoolBall(Ball): + def __init__(self, color, number): + super().__init__(color, shape="sphere") + self.number = number + + def get_state(self): + print( + f"Color = {self.color}, Number = {self.number}, Shape = {self.shape}" + ) + + +class AmericanFootBall(Ball): + def __init__(self, color): + super().__init__(color, shape="prolate spheroid") + + def get_state(self): + print(f"Color = {self.color}, Shape = {self.shape}") diff --git a/python-isinstance/basic_types.py b/python-isinstance/basic_types.py new file mode 100644 index 0000000000..d0d4dc32bd --- /dev/null +++ b/python-isinstance/basic_types.py @@ -0,0 +1,6 @@ +shape = "Sphere" +number = 8 + +isinstance(shape, str) +isinstance(number, int) +isinstance(number, float) diff --git a/python-isinstance/bool_int_test.py b/python-isinstance/bool_int_test.py new file mode 100644 index 0000000000..66c6148b31 --- /dev/null +++ b/python-isinstance/bool_int_test.py @@ -0,0 +1,18 @@ +isinstance(True, int) + +isinstance(True, bool) + +isinstance(False, int) + +isinstance(False, bool) + +test_data = [10, True, False] + +for element in test_data: + print("int") if isinstance(element, int) else print("bool") + +for element in test_data: + print("bool") if isinstance(element, bool) else print("int") + +for element in test_data: + print("bool") if type(element) is bool else print("int") # noqa diff --git a/python-isinstance/calculate_area_v1.py b/python-isinstance/calculate_area_v1.py new file mode 100644 index 0000000000..a176ebf232 --- /dev/null +++ b/python-isinstance/calculate_area_v1.py @@ -0,0 +1,7 @@ +def calculate_area(length, breadth): + return length * breadth + + +calculate_area(5, 3) +calculate_area(5, "3") +calculate_area("5", "3") diff --git a/python-isinstance/calculate_area_v2.py b/python-isinstance/calculate_area_v2.py new file mode 100644 index 0000000000..907160a0c0 --- /dev/null +++ b/python-isinstance/calculate_area_v2.py @@ -0,0 +1,9 @@ +def calculate_area(length, breadth): + if isinstance(length, int) and isinstance(breadth, int): + return length * breadth + raise TypeError("Both arguments must be integers") + + +calculate_area(5, 3) +calculate_area(5, "3") +calculate_area("5", "3") diff --git a/python-isinstance/consolidation1_solution.py b/python-isinstance/consolidation1_solution.py new file mode 100644 index 0000000000..b448adb84b --- /dev/null +++ b/python-isinstance/consolidation1_solution.py @@ -0,0 +1,20 @@ +from balls import AmericanFootBall, Ball, PoolBall + +ball = Ball("green", "sphere") +football = AmericanFootBall("brown") + +isinstance(football, AmericanFootBall) + +isinstance(football, PoolBall) + +isinstance(ball, Ball) + +isinstance(ball, AmericanFootBall) + +isinstance(football, Ball) + +isinstance(ball, PoolBall) + +isinstance(1, bool) + +isinstance(0, bool) diff --git a/python-isinstance/consolidation2_solution.py b/python-isinstance/consolidation2_solution.py new file mode 100644 index 0000000000..2c7bd20181 --- /dev/null +++ b/python-isinstance/consolidation2_solution.py @@ -0,0 +1,23 @@ +from abc import ABC +from collections.abc import Callable + +from balls_v2 import AmericanFootBall, PoolBall + +eight_ball = PoolBall("black", 8) +football = AmericanFootBall("brown") + +# a) + +isinstance(eight_ball, ABC) +isinstance(football, ABC) + +# b) + +isinstance(isinstance, Callable) +isinstance(PoolBall, Callable) + +# c) + +isinstance(eight_ball.get_state, Callable) + +isinstance(PoolBall, Callable) diff --git a/python-isinstance/isinstance_vs_type.py b/python-isinstance/isinstance_vs_type.py new file mode 100644 index 0000000000..7503b9d36b --- /dev/null +++ b/python-isinstance/isinstance_vs_type.py @@ -0,0 +1,11 @@ +from balls import Ball, PoolBall + +eight_ball = PoolBall("black", 8) + +type(eight_ball) + +type(eight_ball) is PoolBall + +isinstance(eight_ball, Ball) + +type(eight_ball) is Ball diff --git a/python-isinstance/isinstance_with_abc.py b/python-isinstance/isinstance_with_abc.py new file mode 100644 index 0000000000..51d5b35041 --- /dev/null +++ b/python-isinstance/isinstance_with_abc.py @@ -0,0 +1,9 @@ +from balls_v2 import AmericanFootBall, Ball, PoolBall + +eight_ball = PoolBall("black", 8) + +football = AmericanFootBall("brown") + +isinstance(eight_ball, Ball) + +isinstance(football, Ball) diff --git a/python-isinstance/iter_test.py b/python-isinstance/iter_test.py new file mode 100644 index 0000000000..a029eeefb5 --- /dev/null +++ b/python-isinstance/iter_test.py @@ -0,0 +1,14 @@ +from player_iterables import ( + PlayersVersionFour, + PlayersVersionOne, + PlayersVersionThree, + PlayersVersionTwo, +) + +iter(PlayersVersionOne(["Fast Ed", "Slow Jo", "Still Su"])) + +iter(PlayersVersionTwo(["Fast Ed", "Slow Jo", "Still Su"])) + +iter(PlayersVersionThree(["Fast Ed", "Slow Jo", "Still Su"])) + +iter(PlayersVersionFour(["Fast Ed", "Slow Jo", "Still Su"])) diff --git a/python-isinstance/mro.py b/python-isinstance/mro.py new file mode 100644 index 0000000000..5626cd52e2 --- /dev/null +++ b/python-isinstance/mro.py @@ -0,0 +1,14 @@ +class Top: + pass + + +class Middle(Top): + pass + + +class Bottom(Middle): + pass + + +Bottom.mro() +isinstance(Bottom(), Top) diff --git a/python-isinstance/multiple_type_tests.py b/python-isinstance/multiple_type_tests.py new file mode 100644 index 0000000000..703d1fce6a --- /dev/null +++ b/python-isinstance/multiple_type_tests.py @@ -0,0 +1,11 @@ +print("Number" if isinstance(3.14, (int, float)) else "Not a number") + +print("Number" if isinstance("3.14", (int, float)) else "Not a number") + +print("Number" if isinstance(3.14, ((int,), (float,))) else "Not a number") + +print("Number" if isinstance(3.14, (int, float)) else "Not a number") + +print("Number" if isinstance(3.14, int | float) else "Not a number") + +print("Number" if isinstance("3.14", int | float) else "Not a number") diff --git a/python-isinstance/player_iterables.py b/python-isinstance/player_iterables.py new file mode 100644 index 0000000000..4bd3c62b38 --- /dev/null +++ b/python-isinstance/player_iterables.py @@ -0,0 +1,38 @@ +from collections.abc import Iterable + + +class PlayersVersionOne(Iterable): + def __init__(self, players): + self.players = players + + def __iter__(self): + return iter(self.players) + + +class PlayersVersionTwo: + + def __init__(self, players): + self.players = players + + def __iter__(self): + return iter(self.players) + + +class PlayersVersionThree: + + def __init__(self, players): + self.players = players + + def __getitem__(self, index): + if index >= len(self.players): + raise IndexError + return self.players[index] + + +class PlayersVersionFour: + + def __init__(self, players): + self.players = players + + def __iter__(self): + pass diff --git a/python-isinstance/players_iterable_tests.py b/python-isinstance/players_iterable_tests.py new file mode 100644 index 0000000000..3af0a45abe --- /dev/null +++ b/python-isinstance/players_iterable_tests.py @@ -0,0 +1,29 @@ +from collections.abc import Iterable + +from player_iterables import ( + PlayersVersionFour, + PlayersVersionOne, + PlayersVersionThree, + PlayersVersionTwo, +) + +for player in PlayersVersionOne(["Fast Ed", "Slow Jo", "Still Su"]): + print(player) + +isinstance(PlayersVersionOne(["Fast Ed", "Slow Jo", "Still Su"]), Iterable) + +for player in PlayersVersionTwo(["Fast Ed", "Slow Jo", "Still Su"]): + print(player) + +isinstance(PlayersVersionTwo(["Fast Ed", "Slow Jo", "Still Su"]), Iterable) + +for player in PlayersVersionThree(["Fast Ed", "Slow Jo", "Still Su"]): + print(player) + +isinstance(PlayersVersionThree(["Fast Ed", "Slow Jo", "Still Su"]), Iterable) + +# This will fail. +for player in PlayersVersionFour(["Fast Ed", "Slow Jo", "Still Su"]): + print(player) + +isinstance(PlayersVersionFour(["Fast Ed", "Slow Jo", "Still Su"]), Iterable) diff --git a/python-isinstance/type_tests.py b/python-isinstance/type_tests.py new file mode 100644 index 0000000000..830077579a --- /dev/null +++ b/python-isinstance/type_tests.py @@ -0,0 +1,12 @@ +from balls import Ball, PoolBall + +eight_ball = PoolBall("black", 8) + +type(eight_ball) + +type(eight_ball) is PoolBall + + +isinstance(eight_ball, Ball) + +type(eight_ball) is Ball