Practical Implementation Patterns
Gestion dynamique de la configuration
Classe de configuration avec attributs dynamiques
class DynamicConfig:
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
def update_config(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
## Usage example
config = DynamicConfig(debug=True, database='postgresql')
config.update_config(max_connections=100, timeout=30)
Modèle de validation de données flexible
class ValidatedObject:
def __init__(self):
self._validators = {}
def add_validator(self, attribute, validator_func):
self._validators[attribute] = validator_func
def __setattr__(self, name, value):
if name in self._validators:
if not self._validators[name](value):
raise ValueError(f"Invalid value for {name}")
super().__setattr__(name, value)
## Example usage
def is_positive(x):
return x > 0
obj = ValidatedObject()
obj.add_validator('age', is_positive)
obj.age = 25 ## Works
## obj.age = -5 ## Raises ValueError
Suivi et journalisation des attributs
class AttributeTracker:
def __init__(self):
self._attribute_log = {}
def __setattr__(self, name, value):
if not name.startswith('_'):
self._attribute_log[name] = {
'value': value,
'timestamp': __import__('datetime').datetime.now()
}
super().__setattr__(name, value)
def get_attribute_history(self):
return self._attribute_log
Modèles d'attributs dynamiques
Modèle |
Description |
Cas d'utilisation |
Chargement paresseux (Lazy Loading) |
Créer des attributs seulement lorsqu'ils sont accédés |
Optimisation des ressources |
Propriétés calculées (Computed Properties) |
Générer des attributs dynamiquement |
Calculs complexes |
Proxy d'attribut (Attribute Proxying) |
Rediriger l'accès aux attributs |
Fonctionnalité de middleware |
Modèle de proxy d'attribut
class AttributeProxy:
def __init__(self, target):
self._target = target
self._interceptors = {}
def add_interceptor(self, attribute, interceptor_func):
self._interceptors[attribute] = interceptor_func
def __getattr__(self, name):
if name in self._interceptors:
return self._interceptors[name](self._target)
return getattr(self._target, name)
## Example usage
class User:
def __init__(self, name, role):
self.name = name
self.role = role
def role_checker(user):
return user.role == 'admin'
user = User('LabEx Admin', 'admin')
proxy = AttributeProxy(user)
proxy.add_interceptor('is_admin', role_checker)
Workflow des attributs dynamiques
graph TD
A[Attribute Request] --> B{Interceptor Exists?}
B -->|Yes| C[Apply Interceptor]
B -->|No| D[Standard Attribute Access]
C --> E[Return Processed Value]
D --> E
Considérations avancées
- Implications sur les performances des attributs dynamiques
- Gestion de la mémoire
- Sécurité des types
- Stratégies de gestion des erreurs
La mise en œuvre pratique des attributs dynamiques nécessite une conception minutieuse et la prise en compte des cas d'utilisation spécifiques et des exigences du système.