Eine Python-Bibliothek, die es Ihnen ermöglicht, abstrakte Eigenschaften für Datenklassen zu definieren und so die Lücke zwischen abstrakten Basisklassen (ABCs) und Datenklassen zu schließen.
Installieren Sie die Bibliothek mit pip:
pip install dataclassabc
Der dataclassabc
-Dekorator ermöglicht die Verwendung abstrakter Eigenschaften innerhalb von Datenklassen. Es löst abstrakte Eigenschaften auf, die in einer abstrakten Basisklasse (ABC) definiert sind, und erzwingt deren Implementierung durch Felder in der abgeleiteten Datenklasse.
So können Sie eine abstrakte Eigenschaft in einer Basisklasse definieren und in einer abgeleiteten Datenklasse implementieren:
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
Die Verwendung des standardmäßigen dataclass
Dekorators aus dem dataclasses
-Modul zum Implementieren abstrakter Eigenschaften führt zu einem TypeError, wie unten gezeigt:
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' )
Sie können veränderbare abstrakte Eigenschaften definieren, indem Sie die Dekoratoren @property
und @name.setter
in der abstrakten Klasse verwenden. Das folgende Beispiel zeigt, wie eine veränderbare Eigenschaft definiert und festgelegt wird:
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 = } ' )