OOP Mastery
Metaclasses, descriptors, and advanced OOP techniques.
Overview
Master advanced OOP.
Metaclass Registry
class PluginRegistry(type):
_plugins = {}
def __new__(cls, name, bases, attrs):
new_class = super().__new__(cls, name, bases, attrs)
if name != 'Plugin':
cls._plugins[name] = new_class
return new_class
@classmethod
def get_plugins(cls):
return cls._plugins.copy()
class Plugin(metaclass=PluginRegistry):
pass
class AuthPlugin(Plugin):
def authenticate(self):
return "Authenticated"
class DataPlugin(Plugin):
def process(self):
return "Data processed"
print(PluginRegistry.get_plugins())
Descriptor Pattern
class CachedProperty:
def __init__(self, func):
self.func = func
def __set_name__(self, owner, name):
self.name = name
def __get__(self, obj, objtype=None):
if obj is None:
return self
value = self.func(obj)
setattr(obj, self.name, value)
return value
class DataAnalyzer:
def __init__(self, data):
self.data = data
@CachedProperty
def mean(self):
print("Computing mean...")
return sum(self.data) / len(self.data)
analyzer = DataAnalyzer([1, 2, 3, 4, 5])
print(analyzer.mean) # Computes
print(analyzer.mean) # Uses cache
Practice
Build a plugin system using metaclasses.