Clases de datos en Python | Conjunto 2 (parámetros de decorador)

Requisito previo: clases de datos en Python | Serie 1

En esta publicación, discutiremos cómo modificar el constructor predeterminado que el dataclass módulo virtualmente hace para nosotros.

dataclass()decorador –

@dataclasses.dataclass(*, init=Verdadero, repr=Verdadero, eq=Verdadero, orden=Falso, unsafe_hash=Falso, congelado=Falso)

Al cambiar los valores de estos parámetros, podemos modificar el comportamiento y el funcionamiento del constructor predeterminado creado para nuestras DataClasses.

init: este parámetro especifica si debe haber un constructor predeterminado o no.

True (default): There will be a default Constructor.
False         : There won't be a default Constructor.
from dataclasses import dataclass
  
@dataclass(init = False)
class GfgArticle():
  
    title: str
    author: str
    language: str
    upvotes: int
  
# A DataClass object
article = GfgArticle("DataClasses",
                     "vibhu4agarwal",
                     "Python", 0)
TypeError: object() takes no parameters

repr : este parámetro especifica cómo se comportará la función __repr__() . El valor falso corresponde a la representación del valor hash del objeto en la memoria. El valor verdadero corresponde a la representación DataClass del objeto.

from dataclasses import dataclass
  
@dataclass(repr = False)
class GfgArticle():
  
    title: str
    author: str
    language: str
    upvotes: int
  
# A DataClass object
article = GfgArticle("DataClasses",
                     "vibhu4agarwal",
                     "Python", 0)
print(article)

Producción:

__main__.GfgArticle object at 0x7f391b7ddbe0

eq : este parámetro se usa para especificar la operación realizada en comparación cuando dos clases de datos se comparan para determinar la igualdad usando los operadores == o != . eq toma valores booleanos.

from dataclasses import dataclass
  
@dataclass(repr = False, eq = False)
class GfgArticle():
  
    title: str
    author: str
    language: str
    upvotes: int
  
# Two DataClass objects
dClassArticle1 = GfgArticle("DataClasses",
                            "vibhu4agarwal",
                            "Python", 0)
  
dClassArticle2 = GfgArticle("DataClasses",
                            "vibhu4agarwal",
                            "Python", 0)
  
equal = dClassArticle1 == dClassArticle2
print('Classes Equal:', equal)

Producción:

__main__.GfgArticle object at 0x7ff501c63c18
__main__.GfgArticle object at 0x7ff501c63ba8
Classes Equal: False

Cuando eq=False , los dos objetos se comparan utilizando su hash en función de su ubicación en la memoria como dos objetos normales. Dado que los dos objetos tienen una representación hash diferente, su igualdad devuelve False.

order: la comparación entre dos clases de datos no solo se limita a la igualdad, sino que también admite los operadores > , >= , < y <= cuando order=True se establece en el parámetro del argumento.
La comparación entre objetos se basa en la comparación entre sus atributos correspondientes, que se realiza uno a uno a partir del primero.

from dataclasses import dataclass 
    
@dataclass(order = True)
class A():
    var1: int
    var2: str
    var3: float
  
obj1 = A(1, "GeeksForGeeks", 7.0)
obj2 = A(2, "GeeksForGeeks", 7.0)
obj3 = A(1, "GfG", 7.0)
obj4 = A(1, "GeeksForGeeks", 8.0)
  
print(obj1 >  obj2)
print(obj1 <  obj3)
print(obj1 >= obj4)

Producción:

False
True
False

frozen : Esto establece todas las variables en DataClass como inicializables una vez que, una vez inicializadas, no se pueden reasignar a un nuevo valor. Los usuarios de C++ pueden relacionar esto con const y los usuarios de Java pueden relacionarlo con la palabra clave final .

from dataclasses import dataclass 
    
@dataclass(frozen = True)
class GfgArticle():
    
    title: str
    author: str
    language: str
    upvotes: int
  
dClassArticle = GfgArticle("DataClasses",
                           "vibhu4agarwal",
                           "Python", 0)
print(dClassArticle)
  
dClassArticle.upvotes = 100
print(dClassArticle)

GfgArticle(title=’DataClasses’, author=’vibhu4agarwal’, language=’Python’, upvotes=0)
Rastreo (última llamada más reciente):
Archivo “dClass.py”, línea 16, en <módulo>
dClassArticle.upvotes = 100
Archivo “<string>”, línea 3, en __setattr__
dataclasses.FrozenInstanceError: no se puede asignar al campo ‘upvotes’

unsafe_hash: generalmente, los objetos mutables en python son Unhashable . Esto significa que su hash no se puede generar usando la función hash() de Python.
Dado que cualquier objeto de clase, incluidos los valores de los objetos DataClass, puede cambiar, son mutables. Por lo tanto, no deberían poder producir ningún valor hash.

from dataclasses import dataclass 
    
@dataclass
class GfgArticle():
    
    title: str
    author: str
    language: str
    upvotes: int
  
dClassArticle = GfgArticle("DataClasses",
                           "vibhu4agarwal",
                           "Python", 0)
print(dClassArticle)
print(hash(dClassArticle))

GfgArticle(title=’DataClasses’, author=’vibhu4agarwal’, language=’Python’, upvotes=0)
Rastreo (última llamada más reciente):
Archivo «dClass.py», línea 15, en <módulo>
print(hash( dClassArticle))
TypeError: tipo no modificable: ‘GfgArticle’

Sin embargo , frozen=True establece las variables inicializables una vez y, por lo tanto, hace que el objeto sea inmutable. Esto genera de forma segura un hash para el objeto DataClass.

from dataclasses import dataclass 
    
@dataclass(frozen = True)
class GfgArticle():
    
    title: str
    author: str
    language: str
    upvotes: int
  
dClassArticle = GfgArticle("DataClasses",
                           "vibhu4agarwal",
                           "Python", 0)
print(dClassArticle)
print(hash(dClassArticle))

Producción:

GfgArticle(título=’Clases de datos’, autor=’vibhu4agarwal’, idioma=’Python’, votos a favor=0)
9111021502060859577

unsafe_hash obliga a una clase de datos que aún es mutable a generar un hash.

Este caso entra en uso cuando lógicamente, sabemos que una vez inicializados, no vamos a cambiar los valores de los atributos de Dataclass. Pero todo se reduce a la pregunta de ¿Se pueden cambiar? o en otras palabras, ¿La clase de datos no está congelada o no? Al usar unsafe_hash , si DataClass no está congelada, entonces DataClass genera un hash inseguro , asumiendo que la clase está congelada y luego el programador tiene que seguir usándola con mucho cuidado.

from dataclasses import dataclass 
    
@dataclass(unsafe_hash = True)
class GfgArticle():
    
    title: str
    author: str
    language: str
    upvotes: int
  
dClassArticle = GfgArticle("DataClasses",
                           "vibhu4agarwal",
                           "Python", 0)
print(dClassArticle)
print(hash(dClassArticle))

Producción:

GfgArticle(título=’Clases de datos’, autor=’vibhu4agarwal’, idioma=’Python’, votos a favor=0)
8924105619418522237

Publicación traducida automáticamente

Artículo escrito por vibhu4agarwal 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 *