Par exemple, vous pouvez définir les fonctions abstraites getter, setter et deleter avec @abstractmethod
y @property
, @name.setter
o @name.deleter
en Person
classe abstraite comme indiqué ci-dessous. * @abstractmethod
doit être le décorateur le plus proche, sinon une erreur se produit :
from abc import ABC, abstractmethod
class Person(ABC):
@property
@abstractmethod # The innermost decorator
def name(self): # Abstract getter
pass
@name.setter
@abstractmethod # The innermost decorator
def name(self, name): # Abstract setter
pass
@name.deleter
@abstractmethod # The innermost decorator
def name(self): # Abstract deleter
pass
Ensuite, vous pouvez étendre Person
classe abstraite con Student
classe , surcharge les fonctions abstraites getter, setter et deleter de la fonction Student
classe , instancié Student
classe et appeler les fonctions getter, setter et deleter comme indiqué ci-dessous :
class Student(Person):
def __init__(self, name):
self._name = name
@property
def name(self): # Overrides abstract getter
return self._name
@name.setter
def name(self, name): # Overrides abstract setter
self._name = name
@name.deleter
def name(self): # Overrides abstract deleter
del self._name
obj = Student("John") # Instantiates "Student" class
print(obj.name) # Getter
obj.name = "Tom" # Setter
print(obj.name) # Getter
del obj.name # Deleter
print(hasattr(obj, "name"))
Sortie :
John
Tom
False
En fait, même si vous ne surchargez pas le setter et le deleter abstraits de la fonction Student
classe et instancie Student
classe comme indiqué ci-dessous :
class Student(Person): # Extends "Person" class
def __init__(self, name):
self._name = name
@property
def name(self): # Overrides only abstract getter
return self._name
# @name.setter
# def name(self, name): # Overrides abstract setter
# self._name = name
# @name.deleter
# def name(self): # Overrides abstract deleter
# del self._name
obj = Student("John") # Instantiates "Student" class
# ...
Aucune erreur ne se produit comme indiqué ci-dessous :
John
Tom
False
Mais si vous ne surchargez pas les fonctions abstraites getter, setter et deleter de la fonction Student
classe et instancie Student
classe comme indiqué ci-dessous :
class Student(Person): # Extends "Person" class
def __init__(self, name):
self._name = name
# @property
# def name(self): # Overrides only abstract getter
# return self._name
# @name.setter
# def name(self, name): # Overrides abstract setter
# self._name = name
# @name.deleter
# def name(self): # Overrides abstract deleter
# del self._name
obj = Student("John") # Instantiates "Student" class
# ...
L'erreur ci-dessous se produit :
TypeError : Impossible d'instancier la classe abstraite Student avec le nom des méthodes abstraites
Et, si vous ne remplacez pas le getter abstrait de Student
classe et instancie Student
classe comme indiqué ci-dessous :
class Student(Person): # Extends "Person" class
def __init__(self, name):
self._name = name
# @property
# def name(self): # Overrides only abstract getter
# return self._name
@name.setter
def name(self, name): # Overrides abstract setter
self._name = name
@name.deleter
def name(self): # Overrides abstract deleter
del self._name
obj = Student("John") # Instantiates "Student" class
# ...
L'erreur ci-dessous se produit :
NameError : le nom "name" n'est pas défini
Et si @abstractmethod
n'est pas le décorateur le plus proche, comme indiqué ci-dessous :
from abc import ABC, abstractmethod
class Person(ABC):
@abstractmethod # Not the innermost decorator
@property
def name(self): # Abstract getter
pass
@name.setter
@abstractmethod # The innermost decorator
def name(self, name): # Abstract setter
pass
@name.deleter
@abstractmethod # The innermost decorator
def name(self): # Abstract deleter
pass
L'erreur ci-dessous se produit :
AttributeError : attribut ' Méthode abstraite ' des objets "propriété" n'est pas accessible en écriture