Python 3 Deep Dive Part 4 Oop
class PluginMeta(type): plugins = [] def __new__(cls, name, bases, dct): new_class = super().__new__(cls, name, bases, dct) if name != "Plugin": cls.plugins.append(new_class) return new_class class Plugin(metaclass=PluginMeta): @abstractmethod def run(self): pass
class Uppercase(Logger): def log(self, msg): super().log(msg.upper()) python 3 deep dive part 4 oop
class Logger: def log(self, msg): print(f"LOG: {msg}") class Timestamp(Logger): def log(self, msg): print(f"[{time.time()}] ", end="") super().log(msg) class PluginMeta(type): plugins = [] def __new__(cls, name,
def __init__(self, quantity, price): self.quantity = quantity self.price = price dct): new_class = super().__new__(cls
# Forgetting perimeter() => TypeError on instantiation You can register a class as a subclass of an ABC without inheriting:
p = Person("Alice", 30) print(p.to_dict()) # {'name': 'Alice', 'age': 30} For simpler cases, a class decorator can replace a metaclass: