我想在python 3.6中定义一个抽象类,以强制某些属性的存在。从docs看来,您必须将抽象属性定义为getter / setter函数,即使您不打算将getter / setter函数与属性一起使用。
按照文档中的配方,我创建了一个具有两个属性的抽象类:name
和description
。一个读/写另一个只读。
import abc
class AbstractTestClass(abc.ABC):
def __init__(self):
""" Constructor
"""
pass
def __repr__(self):
return 'AbstractTestClass'
@property
@abc.abstractmethod
def name(self):
return 'Not defined'
@name.setter
@abc.abstractmethod
def name(self):
pass
@property
@abc.abstractmethod
def description(self):
return 'Not defined'
我想要的是能够像这样的简单方式基于抽象类创建一个类:
class ConcreteClass1(AbstractTestClass):
"""
Simple class definition
"""
def __init__(self):
# Set values to properties using simple assignment
self.name = 'Concrete class 1'
self.description = 'Concrete class 1 description'
我只想确保已经定义了名称和描述属性。但是,如果我创建此类的实例,则会引发错误
class1 = ConcreteClass1()
TypeError: Can't instantiate abstract class ConcreteClass1 with abstract methods description, name
作为练习,我从抽象类中创建了另一个类:
class ConcreteClass2(AbstractTestClass):
"""
This class works but it's not what I want
"""
def __init__(self):
# define private variable for name
self._name = 'Concrete class 2'
@property
def name(self):
return self._name
@name.setter
def name(self,value):
self._name = value
@property
def description(self):
return 'Concrete class 2 description'
这有效,它实例化,但是它丑陋且冗长,感觉抽象类对我没有帮助。
是否有一种方法可以实现更简洁的ConcreteClass1
之类的东西?还是只将属性放入抽象类__init__()
函数中,并要求子类必须调用super().__init__()
?