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