Python Basics - 12. Advanced OOP Essentials

This notebook expands OOP topics with @property, class methods, static methods, and data classes. These patterns are widely used in production Python code.

Download Notebook

Download this notebook

1. @property for Controlled Attributes

@property lets you expose method logic as if it were an attribute, helping enforce validation rules.

class Circle:
    def __init__(self, radius):
        self.radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, value):
        if value <= 0:
            raise ValueError("Radius must be positive")
        self._radius = value

    @property
    def area(self):
        return 3.14159 * self.radius ** 2

c = Circle(3)
print(c.radius, c.area)
3 28.27431

2. Class Methods vs Static Methods

  • @classmethod receives cls, often used as alternative constructors.

  • @staticmethod does not receive self or cls; it’s a utility function logically grouped inside a class.

class Temperature:
    def __init__(self, celsius):
        self.celsius = celsius

    @classmethod
    def from_fahrenheit(cls, fahrenheit):
        return cls((fahrenheit - 32) * 5 / 9)

    @staticmethod
    def is_freezing(celsius):
        return celsius <= 0

t = Temperature.from_fahrenheit(68)
print(t.celsius)
print(Temperature.is_freezing(t.celsius))
20.0
False

3. Data Classes

dataclasses reduce boilerplate by auto-generating __init__, __repr__, and comparisons for data containers.

from dataclasses import dataclass

@dataclass
class Student:
    name: str
    score: float

alice = Student("Alice", 95.5)
bob = Student("Bob", 88.0)
print(alice)
print(alice.score > bob.score)
Student(name='Alice', score=95.5)
True