Comprender las clases de datos de Python

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)
Producción

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *