Métodos de restricción avanzados
Técnicas de control integral de atributos
La restricción avanzada de atributos va más allá de la protección básica, ofreciendo métodos sofisticados para controlar el comportamiento de los objetos y prevenir modificaciones no autorizadas.
class ImmutableMeta(type):
def __new__(cls, name, bases, attrs):
## Prevent adding new attributes after class creation
attrs['__setattr__'] = cls.immutable_setattr
return super().__new__(cls, name, bases, attrs)
@staticmethod
def immutable_setattr(self, name, value):
if hasattr(self, name):
raise AttributeError("Cannot modify existing attributes")
object.__setattr__(self, name, value)
class SecureClass(metaclass=ImmutableMeta):
def __init__(self, x):
self.x = x
2. Protección de atributos basada en descriptores
class ProtectedAttribute:
def __init__(self, initial_value=None):
self._value = initial_value
self._protected = False
def __get__(self, instance, owner):
return self._value
def __set__(self, instance, value):
if self._protected:
raise AttributeError("Attribute is read-only")
self._value = value
def lock(self):
self._protected = True
Comparación de métodos de restricción
Método |
Complejidad |
Flexibilidad |
Rendimiento |
Metaclase |
Alta |
Media |
Baja |
Descriptores |
Media |
Alta |
Media |
__slots__ |
Baja |
Baja |
Alta |
3. Técnicas de validación avanzadas
graph TD
A[Attribute Validation] --> B[Type Checking]
A --> C[Range Validation]
A --> D[Custom Constraints]
Ejemplo de validación integral
class ValidatedClass:
def __init__(self):
self._sensitive_data = None
@property
def sensitive_data(self):
return self._sensitive_data
@sensitive_data.setter
def sensitive_data(self, value):
## Multiple validation checks
if not isinstance(value, str):
raise TypeError("Must be a string")
if len(value) < 8:
raise ValueError("Value too short")
if not any(char.isdigit() for char in value):
raise ValueError("Must contain a digit")
self._sensitive_data = value
4. Protección de atributos basada en proxies
class AttributeProxy:
def __init__(self, obj):
self._obj = obj
self._locked = False
def lock(self):
self._locked = True
def __getattr__(self, name):
if self._locked:
raise AttributeError("Object is locked")
return getattr(self._obj, name)
def __setattr__(self, name, value):
if name.startswith('_'):
super().__setattr__(name, value)
elif self._locked:
raise AttributeError("Object is locked")
else:
setattr(self._obj, name, value)
Puntos clave
- Los métodos avanzados proporcionan un control granular de atributos.
- Elija la técnica de restricción en función de los requisitos específicos.
- Encuentre un equilibrio entre protección y flexibilidad.
Mejores prácticas en el entorno LabEx
- Utilice el método de protección más simple que cumpla con sus necesidades.
- Implemente la validación a nivel de atributo.
- Considere las implicaciones de rendimiento de las restricciones complejas.
Al dominar estos métodos de restricción avanzados, los desarrolladores pueden crear clases de Python más seguras y controladas.