Python Tutorial — Learn Python Step by Step
Key takeaway: Master Python programming from scratch — variables, loops, functions, OOP, file handling, and libraries — with clear human-readable explanations and runnable code examples.
Python Multiple Inheritance
Multiple inheritance allows a class to inherit from more than one parent class, combining their attributes and methods. Python uses the Method Resolution Order (MRO) to determine which method is called.
Basic Multiple Inheritance
# A class can inherit from multiple parent classes
class Flyable:
def fly(self):
return f"{self.name} is flying!"
class Swimmable:
def swim(self):
return f"{self.name} is swimming!"
class Walkable:
def walk(self):
return f"{self.name} is walking!"
# Duck inherits from all three
class Duck(Flyable, Swimmable, Walkable):
def __init__(self, name):
self.name = name
duck = Duck("Donald")
print(duck.fly()) # Donald is flying!
print(duck.swim()) # Donald is swimming!
print(duck.walk()) # Donald is walking!Method Resolution Order (MRO)
# When multiple parents have the same method, Python uses MRO
# MRO follows C3 linearization: left-to-right, depth-first
class A:
def greet(self):
return "Hello from A"
class B(A):
def greet(self):
return "Hello from B"
class C(A):
def greet(self):
return "Hello from C"
class D(B, C): # B is listed before C
pass
d = D()
print(d.greet()) # "Hello from B" (B comes first in MRO)
# View the MRO
print(D.__mro__)
# (D, B, C, A, object)
# Python searches: D → B → C → A → object
# Or use .mro() method
print(D.mro())Mixins — The Practical Pattern
# Mixins are small classes that add specific functionality
# They are not meant to be instantiated alone
class JsonMixin:
"""Add JSON serialization to any class."""
def to_json(self):
import json
return json.dumps(self.__dict__, indent=2)
@classmethod
def from_json(cls, json_str):
import json
data = json.loads(json_str)
return cls(**data)
class LogMixin:
"""Add logging capability to any class."""
def log(self, message):
print(f"[{type(self).__name__}] {message}")
class TimestampMixin:
"""Add creation timestamp."""
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
def set_created(self):
from datetime import datetime
self.created_at = datetime.now().isoformat()
# Combine mixins with a main class
class User(JsonMixin, LogMixin):
def __init__(self, name, email):
self.name = name
self.email = email
user = User("Alice", "alice@example.com")
user.log("User created") # [User] User created
print(user.to_json()) # {"name": "Alice", "email": "alice@..."}
# Recreate from JSON
json_str = user.to_json()
user2 = User.from_json(json_str)
print(user2.name) # Alicesuper() with Multiple Inheritance
# super() follows the MRO — it calls the NEXT class in line, not the parent
class Base:
def __init__(self):
print("Base.__init__")
class Left(Base):
def __init__(self):
print("Left.__init__")
super().__init__() # calls Right (next in MRO), not Base!
class Right(Base):
def __init__(self):
print("Right.__init__")
super().__init__() # calls Base
class Child(Left, Right):
def __init__(self):
print("Child.__init__")
super().__init__() # calls Left
child = Child()
# Output (follows MRO: Child → Left → Right → Base):
# Child.__init__
# Left.__init__
# Right.__init__
# Base.__init__
# Cooperative multiple inheritance pattern
class Serializable:
def __init__(self, **kwargs):
super().__init__(**kwargs)
def serialize(self):
return self.__dict__.copy()
class Validatable:
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.validate()
def validate(self):
pass # override in subclass
class Product(Serializable, Validatable):
def __init__(self, name, price, **kwargs):
self.name = name
self.price = price
super().__init__(**kwargs)
def validate(self):
if self.price < 0:
raise ValueError("Price cannot be negative")Diamond Problem
# The diamond problem: D inherits B and C, both inherit A
# A
# / \
# B C
# \ /
# D
class A:
def method(self):
print("A.method")
class B(A):
def method(self):
print("B.method")
super().method()
class C(A):
def method(self):
print("C.method")
super().method()
class D(B, C):
def method(self):
print("D.method")
super().method()
D().method()
# D.method → B.method → C.method → A.method
# Each class called only ONCE thanks to MRO
# Python solves the diamond problem cleanly with C3 linearization
print(D.__mro__)
# (D, B, C, A, object)- Python supports multiple inheritance — a class can have multiple parent classes.
- MRO (Method Resolution Order) determines which method is called — check with
Class.__mro__. - Use mixins (small, focused classes) as the primary pattern for multiple inheritance.
super()follows the MRO chain, not necessarily the direct parent class.- Python solves the diamond problem via C3 linearization — each class appears only once in the MRO.
Python Programming Tutorial — Learn Python in a practical, step-by-step way. According to the official Python documentation, Python emphasizes code readability and simplicity, making it ideal for beginners.
Related tools: Python Online Compiler | Python Examples | JavaScript Tutorial | Java Tutorial
Python Career & Learning Guide
Python is the world's most popular programming language for beginners, data science, AI/ML, web development, and automation. This tutorial teaches Python step-by-step with clear explanations and runnable code examples in our free Python Compiler.
Why Learn Python in 2026?
- #1 Most Popular Language: Ranked first on TIOBE, Stack Overflow, and GitHub.
- AI and Data Science: The primary language for machine learning (TensorFlow, PyTorch, scikit-learn) and data analysis (Pandas, NumPy).
- Web Development: Django and Flask power scalable backends at companies like Instagram and Spotify.
- Automation & Scripting: Automate files, emails, web scraping, and data processing in minutes.
Python vs Other Languages
| Feature | Python | Java | JavaScript | C++ |
|---|---|---|---|---|
| Syntax | Very clean, readable | Verbose | Moderate | Complex |
| Typing | Dynamic, strong | Static, strong | Dynamic, weak | Static, strong |
| Best For | AI/ML, Data, Web | Enterprise, Android | Web Frontend/Backend | Systems, Games |
| Learning Time | 2–4 weeks basics | 4–6 weeks basics | 3–4 weeks basics | 8–12 weeks basics |
Frequently Asked Questions
Do I need prior programming experience to learn Python?
No! Python is specifically designed to be beginner-friendly. This tutorial starts from zero and builds up gradually.
Which Python version should I use?
Python 3.10+ is recommended. All examples in this tutorial use Python 3 syntax.
Is this Python tutorial completely free?
Yes, 100% free with no registration or sign-up required. Access all lessons and code examples anytime.