Advertisement
Fhernd

modelo_datos.py

Jan 7th, 2019
1,044
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.09 KB | None | 0 0
  1. class Descriptor:
  2.     def __init__(self, nombre=None, **opts):
  3.         self.nombre = nombre
  4.  
  5.         for k, v in opts.items():
  6.             setattr(self, k, v)
  7.  
  8.     def __set__(self, instancia, valor):
  9.         instancia.__dict__[self.nombre] = valor
  10.  
  11.  
  12. class Tipeado(Descriptor):
  13.     tipo_esperado = type(None)
  14.  
  15.     def __set__(self, instancia, valor):
  16.         if not isinstance(valor, self.tipo_esperado):
  17.             raise TypeError('Se esperaba el tipo: {}'.format(self.tipo_esperado))
  18.  
  19.         super().__set__(instancia, valor)
  20.  
  21.  
  22. class SinSigno(Descriptor):
  23.  
  24.     def __set__(self, instancia, valor):
  25.         if valor < 0:
  26.             raise ValueError('El valor debe ser mayor o igual a cero (0)')
  27.  
  28.         super().__set__(instancia, valor)
  29.  
  30.  
  31. class TamaghnioMaximo(Descriptor):
  32.  
  33.     def __init__(self, nombre=None, **opts):
  34.         if 'tamaghnio' not in opts:
  35.             raise TypeError('Hace falta el atributo tamghnio')
  36.  
  37.         super().__init__(nombre, **opts)
  38.  
  39.     def __set__(self, instancia, valor):
  40.         if len(valor) >= self.tamaghnio:
  41.             raise ValueError('El tamaño debe ser menor a {}'.format(self.tamghnio))
  42.  
  43.         super().__set__(instancia, valor)
  44.  
  45.  
  46.  
  47. # Tipos de datos a partir de las restricciones definidas anteriormente:
  48.  
  49. class Entero(Tipeado):
  50.     tipo_esperado = int
  51.  
  52. class EnteroSinSigno(Entero, SinSigno):
  53.     pass
  54.  
  55. class Decimal(Tipeado):
  56.     tipo_esperado = float
  57.  
  58. class DecimalSinSigno(Decimal, SinSigno):
  59.     pass
  60.  
  61. class String(Tipeado):
  62.     tipo_esperado = str
  63.  
  64. class StringTamghnioFijo(TamaghnioMaximo):
  65.     pass
  66.  
  67.  
  68. # Definición de un tipo de dato acorde a un dominio de problema:
  69. class Producto:
  70.     nombre = StringTamghnioFijo('nombre', tamaghnio=32)
  71.     precio = DecimalSinSigno('precio')
  72.     cantidad = EnteroSinSigno('cantidad')
  73.  
  74.     def __init__(self, nombre, precio, cantidad):
  75.         self.nombre = nombre
  76.         self.precio = precio
  77.         self.cantidad = cantidad
  78.  
  79.  
  80. if __name__ == '__main__':
  81.     producto = Producto('Bluetooth Griffin', 23.5, 100)
  82.  
  83.     print(producto.nombre)
  84.  
  85.     producto.precio = -24.5
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement