Lab 01: Advanced OOP
Objective
Time
Prerequisites
Tools
Lab Instructions
Step 1: Dataclasses & Field Validation
docker run --rm zchencow/innozverse-python:latest python3 -c "
from dataclasses import dataclass, field, fields, asdict
from typing import ClassVar
@dataclass
class Product:
name: str
price: float
stock: int = 0
tags: list[str] = field(default_factory=list)
_registry: ClassVar[list] = []
def __post_init__(self):
if self.price <= 0:
raise ValueError(f'price must be positive, got {self.price}')
if self.stock < 0:
raise ValueError(f'stock cannot be negative')
self.name = self.name.strip()
Product._registry.append(self)
@property
def status(self) -> str:
return 'out_of_stock' if self.stock == 0 else 'active'
def __str__(self) -> str:
return f'[{self.name}] \${self.price:.2f} stock={self.stock} ({self.status})'
@dataclass(frozen=True) # immutable
class SKU:
vendor: str
code: str
def __str__(self):
return f'{self.vendor}-{self.code}'
p1 = Product('Surface Pro 12\"', 864.00, 15, ['laptop', 'microsoft'])
p2 = Product('Surface Pen', 49.99, 80)
print(p1)
print('Dict:', asdict(p1))
print('Fields:', [f.name for f in fields(p1)])
sku = SKU('MSFT', 'SRF-PRO-12')
print('SKU:', sku)
try:
Product('Bad', -10)
except ValueError as e:
print('Error:', e)
"Step 2: Abstract Base Classes
Step 3: Descriptors
Steps 4–8: slots, MRO, Metaclass, Protocol, Capstone
Summary
Feature
Use case
Further Reading
Last updated
