Une bibliothèque Python qui vous permet de définir des propriétés abstraites pour les classes de données, comblant ainsi le fossé entre les classes de base abstraites (ABC) et les classes de données.
Installez la bibliothèque en utilisant pip :
pip install dataclassabc
Le décorateur dataclassabc
permet l'utilisation de propriétés abstraites au sein des classes de données. Il résout les propriétés abstraites définies dans une classe de base abstraite (ABC) et applique leur implémentation via des champs dans la classe de données dérivée.
Voici comment définir une propriété abstraite dans une classe de base et l'implémenter dans une classe de données dérivée :
from abc import ABC , abstractmethod
from dataclassabc import dataclassabc
# Define an abstract base class with an abstract property
class A ( ABC ):
@ property
@ abstractmethod
def name ( self ) -> str : ...
# Use the dataclassabc decorator to implement the abstract property in a dataclass
@ dataclassabc ( frozen = True )
class B ( A ):
# Implementing the abstract property 'name'
name : str
L’utilisation du décorateur dataclass
standard du module dataclasses
pour implémenter des propriétés abstraites entraînera une TypeError, comme indiqué ci-dessous :
from abc import ABC , abstractmethod
from dataclasses import dataclass
@ dataclass ( frozen = True )
class B ( A ):
name : str
# TypeError: Can't instantiate abstract class B without an implementation for abstract method 'name'
b = B ( name = 'A' )
Vous pouvez définir des propriétés abstraites mutables en utilisant les décorateurs @property
et @name.setter
dans la classe abstraite. L'exemple suivant montre comment définir et définir une propriété mutable :
from abc import ABC , abstractmethod
from dataclassabc import dataclassabc
class A ( ABC ):
@ property
@ abstractmethod
def name ( self ) -> str : ...
@ name . setter
@ abstractmethod
def name ( self , val : str ): ...
@ dataclassabc
class B ( A ):
name : str
b = B ( name = 'A' )
# modify the mutable variable
b . name = 'B'
# Output will be b=B(name='B')
print ( f' { b = } ' )