例如,您可以使用@abstractmethod和@property, @name定义抽象的getter、setter和deleter。Person抽象类中的setter或@name.deleter,如下所示。*@abstractmethod必须是最内层的装饰器,否则会出现错误:
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
然后,你可以用Student类扩展Person抽象类,覆盖Student类中的抽象getter、setter和deleter,实例化Student类并调用getter、setter和deleter,如下所示:
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"))
输出:
John
Tom
False
实际上,即使你不重写Student类中的抽象setter和delete,并实例化Student类,如下所示:
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
# ...
没有出现如下错误:
John
Tom
False
但是,如果你不重写学生类中的抽象getter, setter和deleter,并实例化学生类,如下所示:
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
# ...
出现以下错误:
不能用抽象方法名实例化抽象类Student
并且,如果你不重写Student类中的抽象getter,并实例化Student类,如下所示:
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
# ...
出现以下错误:
没有定义name
并且,如果@abstractmethod不是最里面的装饰器,如下所示:
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
出现以下错误:
property对象的属性isabstractmethod不可写