Chapter 13 – Class and Type -------------------------------- Overview -------- This chapter explores Python’s approach to *type* and how it relates to classes and instances. It clarifies what “type” means in Python and how strong vs. dynamic typing is realized. :contentReference[oaicite:3]{index=3} Three Types of Type ------------------- There are multiple notions of type in programming: - The runtime type of an object (`type(obj)`) - The static annotated type (type hints) - Conceptual type based on behavior Primitive Data Types -------------------- Built‑in types like `int`, `str`, and `float` have fixed behaviors but are still Python objects. Class‑Based Type ---------------- Every class defines a type. When you create a class, you create a new type. Hierarchical Typing ------------------ Python’s inheritance hierarchy means types can participate in subclass relationships. For example: .. code-block:: python isinstance(obj, Base) Instance and Subclass --------------------- `isinstance` and `issubclass` help test whether an object belongs to a type or whether a class is derived from another. Duck Typing ----------- Python generally uses *duck typing* — if an object has the right methods and attributes, its type often doesn’t matter for correctness: .. code-block:: python def quack(duck): duck.quack() As long as `duck` has a `quack` method, this works irrespective of actual type. Summary ------- Python’s notion of type combines runtime objects, class definitions, and behavioral expectations rather than rigid compile‑time constraints.