Introduction
Advanced object-oriented programming concepts including metaclasses, descriptors, and slots.
Data Classes
from dataclasses import dataclass, field
from typing import List
@dataclass
class Point:
x: float
y: float
def distance_from_origin(self):
return (self.x**2 + self.y**2) ** 0.5
@dataclass
class Person:
name: str
age: int
friends: List[str] = field(default_factory=list)
Slots
class WithoutSlots:
def __init__(self, x):
self.x = x # Stored in __dict__
class WithSlots:
__slots__ = ['x']
def __init__(self, x):
self.x = x # No __dict__, more memory efficient
Descriptors
class Temperature:
def __get__(self, obj, objtype=None):
return obj._celsius
def __set__(self, obj, value):
obj._celsius = value
class Room:
temperature = Temperature()
def __init__(self, temp):
self.temperature = temp
Practice Problems
- Create a data class for a rectangle
- Compare memory usage with and without slots
- Implement a descriptor for validation
- Add default values to data class
- Create frozen (immutable) data class