DataClasses se ha agregado en una adición reciente en python 3.7 como una herramienta de utilidad para almacenar datos. DataClasses proporciona un decorador y funciones para agregar automáticamente métodos especiales generados como __init__() , __repr__() y __eq__() a las clases definidas por el usuario.
Clase de datos en Python
DataClasses son como clases normales en Python, pero tienen algunas funciones básicas como creación de instancias, comparación e impresión de las clases ya implementadas.
Instalación del módulo DataClasses:
pip install dataclasses
La sintaxis de la clase de datos es:
Sintaxis: @dataclasses.dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
Parámetros:
- init: si es verdadero, se generará el método __init__()
- repr: si es verdadero, se generará el método __repr__()
- eq: si es verdadero, se generará el método __eq__()
- orden: si es verdadero, se generarán los métodos __lt__(), __le__(), __gt__() y __ge__().
- unsafe_hash: si el método False __hash__() se genera de acuerdo con cómo se configuran eq y frozen
- congelado: si es verdadero, la asignación a campos generará una excepción.
El módulo DataClass proporciona una forma práctica de hacer que las clases sean menos prolijas. Veamos el enfoque tradicional sin usar DataClass.
Python3
# creating a employee class class employee: # init method or constructor def __init__(self, name, emp_id, age, city): # Instance Variable self.name = name self.emp_id = emp_id self.age = age self.city = city # magic function to return class object def __repr__(self): return ("employee (name={}, emp_id={}, age={}, city={} )" .format(self.name, self.emp_id, self.age, self.city)) # magic function to return boolean def __eq__(self, check): return ((self.name, self.emp_id, self.age, self.city) == ((check.name, check.emp_id, check.age, check.city))) # initialization the object emp1 = employee("Satyam", "ksatyam858", 21, 'Patna') emp2 = employee("Anurag", "au23", 28, 'Delhi') emp3 = employee("Satyam", "ksatyam858", 21, 'Patna') print("employee object are :") print(emp1) print(emp2) print(emp3) # printing new line print() # referring two object to check equality print("Data in emp1 and emp2 are same? ", emp1 == emp2) print("Data in emp1 and emp3 are same? ", emp1 == emp3)
employee object are : employee (name=Satyam, emp_id=ksatyam858, age=21, city=Patna ) employee (name=Anurag, emp_id=au23, age=28, city=Delhi ) employee (name=Satyam, emp_id=ksatyam858, age=21, city=Patna ) Data in emp1 and emp2 are same? False Data in emp1 and emp3 are same? True
En el código anterior, el mayor problema es pasar el argumento en __init__, __repr__ y __eq__. Cada vez tiene que copiar sus propiedades y devolver el objeto. Es una buena forma de tratar con una pequeña cantidad de datos pero supone que tenemos que trabajar con grandes datos. Hace que tu código sea más complicado. Entonces, es por eso que DataClass implementará para hacer que su código sea más fácil y práctico.
Aquí está el mismo ejemplo, implementado en Python DataClasses .
Python3
# A basic Data Class # importing dataclass module from dataclasses import dataclass # A class for holding an employees content @dataclass class employee: # Attributes Declaration # using Type Hints name: str emp_id: str age: int city: str emp1 = employee("Satyam", "ksatyam858", 21, 'Patna') emp2 = employee("Anurag", "au23", 28, 'Delhi') emp3 = employee("Satyam", "ksatyam858", 21, 'Patna') print("employee object are :") print(emp1) print(emp2) print(emp3) # printing new line print() # referring two object to check equality print("Data in emp1 and emp2 are same? ", emp1 == emp2) print("Data in emp1 and emp3 are same? ", emp1 == emp3)
Producción:
objeto empleado son:
empleado(nombre=’Satyam’, emp_id=’ksatyam858′, edad=21, ciudad=’Patna’)
empleado(nombre=’Anurag’, emp_id=’au23′, edad=28, ciudad=’Delhi ‘)
empleado(nombre=’Satyam’, emp_id=’ksatyam858′, edad=21, ciudad=’Patna’) ¿Los
datos en emp1 y emp2 son los mismos? ¿Los datos falsos
en emp1 y emp3 son iguales? Verdadero
En el código anterior, no necesitamos escribir un código para las funciones __init__ , __repr__ y __eq__.
clases de datos.Field()
Los objetos field() describen cada campo definido.
Sintaxis: dataclasses.field(*, default=MISSING, default_factory=MISSING, repr=True, hash=Ninguno, init=True, compare=True, metadata=Ninguno)
Parámetros:
- defecto
- fábrica_predeterminada
- en eso
- repetir
- picadillo
- comparar
- metadatos
Ejemplo: Demostración de cómo ver los campos de un objeto de clase de datos.
Python3
from dataclasses import dataclass # A class for holding an employees content @dataclass class employee: # Attributes Declaration # using Type Hints name: str emp_id: str age: int city: str # object of the class emp = employee("Satyam", "ksatyam858", 21, 'Patna') emp.__dataclass_fields__
Producción:
Explicación de los parámetros:
- predeterminado: este campo se utiliza para especificar valores predeterminados para este campo.
Python3
# default field example from dataclasses import dataclass, field # A class for holding an employees content @dataclass class employee: # Attributes Declaration # using Type Hints name: str emp_id: str age: int # default field set # city : str = "patna" city: str = field(default="patna") emp = employee("Satyam", "ksatyam858", 21) print(emp)
Producción:
empleado(nombre=’Satyam’, emp_id=’ksatyam858′, edad=21, ciudad=’patna’)
- default_factory: este campo acepta una función y devuelve el valor inicial del campo, debe ser un argumento cero.
Python3
# default factory example from dataclasses import dataclass, field def get_emp_id(): id = 2345 return id # A class for holding an employees content @dataclass class employee: # Attributes Declaration # using Type Hints name: str age: int # default factory field emp_id: str = field(default_factory=get_emp_id) city: str = field(default="patna") # object of dataclass emp = employee("Satyam", 21) print(emp)
Producción:
empleado(nombre=’Satyam’, edad=21, emp_id=2345, ciudad=’patna’)
- init: si es verdadero, este campo se incluye como un parámetro para el método __init__() generado.
Python3
# init field example from dataclasses import dataclass, field # A class for holding an employees content @dataclass class employee: # Attributes Declaration # using Type Hints name: str age: int # init field emp_id: str city: str = field(init=False, default="patna") # object of dataclass emp = employee("Satyam", "ksatyam858", 21) print(emp)
Producción:
empleado(nombre=’Satyam’, edad=’ksatyam858′, emp_id=21, ciudad=’patna’)
- repr: si es verdadero (valor predeterminado), este campo se incluye en la string devuelta por el método __repr__() generado.
Python3
# repr field from dataclasses import dataclass, field # A class for holding an employees content @dataclass class employee: # Attributes Declaration # using Type Hints name: str age: int emp_id: str city: str = field(init=False, default="patna", repr=True) emp = employee("Satyam", 21, "ksatyam858"), print(emp)
Producción:
empleado(nombre=’Satyam’, edad=21, emp_id=’ksatyam858′, ciudad=’patna’)
Si repr es falso entonces:
Python3
city: str = field(init=False, default="patna", repr=False) emp = employee("Satyam", 21, "ksatyam858"), emp
Producción:
employee(name='Satyam', age=21, emp_id='ksatyam858')
- hash: si es verdadero, este campo se incluye en el método __hash__() generado.
Python3
# hash from dataclasses import dataclass, field # A class for holding an employees content @dataclass(unsafe_hash=True) class employee: # Attributes Declaration # using Type Hints name: str age: int emp_id: str = field(default_factory=get_emp_id) city: str = field(init=False, default="patna", repr=True, hash=True) emp = employee("Satyam", "ksatyam858", 21) hash(emp)
Producción:
28166796391311520
Si es falso, no considerará estos campos.
Python3
city: str = field(init=False, default="patna", repr=True, hash=False) # object of the class emp = employee("Satyam", "ksatyam858", 21) hash(emp)
Producción:
6124029366977666702
- comparar: si es verdadero (valor predeterminado), este campo se incluye en los métodos de igualdad y comparación generados (__eq__(), __gt__()).
Python3
# hash from dataclasses import dataclass, field # A class for holding an employees content @dataclass(unsafe_hash=True) class employee: # Attributes Declaration # using Type Hints name: str age: int emp_id: str city: str = field(init=False, default="patna", repr=True, hash=False, compare=True) emp1 = employee("Satyam", "ksatyam858", 21) emp2 = employee("Kumar", "satyam.10151", 22) emp1 == emp2
Producción:
False
- metadatos: Esto puede ser un mapeo o Ninguno. Ninguno se trata como un dictado vacío.
Python3
# hash from dataclasses import dataclass, field # A class for holding an employees content @dataclass(unsafe_hash=True) class employee: # Attributes Declaration # using Type Hints name: str age: int emp_id: str city: str = field(init=False, default="patna", repr=True, metadata={'format': 'State'}) emp = employee("Satyam", "ksatyam858", 21) emp.__dataclass_fields__['city'].metadata['format']
Procesamiento posterior al inicio
Al crear el objeto, la llamada al método __post_init__() se realiza automáticamente. El código __init__() llamará a un método llamado __post_init__().
Ejemplo: en una clase de datos de empleados, si queremos verificar la edad de los empleados, podemos definir el método __post_init__().
Python3
# A basic Data Class # importing dataclass module from dataclasses import dataclass, field # A class for holding an employees content @dataclass class employee: # Attributes Declaration # using Type Hints name: str emp_id: str age: int city: str # post init function def __post_init__(self): if self.age >= 30: self.check_age = True else: self.check_age = False emp = employee("Satyam", "ksatyam858", 21, 'Patna') emp.check_age
Producción:
False
Herencia de clases de datos
La herencia nos permite definir una clase que toma toda la funcionalidad de una clase principal.
Ejemplo: la clase secundaria hereda las propiedades de la clase principal.
Python3
# A basic Data Class # importing dataclass module from dataclasses import dataclass, field # parent class @dataclass class Staff: name: str emp_id: str age: int # child class @dataclass class employee(Staff): salary: int emp = employee("Satyam", "ksatyam858", 21, 60000) emp
Producción:
employee(name='Satyam', emp_id='ksatyam858', age=21, salary=60000)
Publicación traducida automáticamente
Artículo escrito por kumar_satyam y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA