在Python中定义抽象属性

时间:2018-06-19 12:00:25

标签: python class

我想在python 3.6中定义一个抽象类,以强制某些属性的存在。从docs看来,您必须将抽象属性定义为getter / setter函数,即使您不打算将getter / setter函数与属性一起使用。

按照文档中的配方,我创建了一个具有两个属性的抽象类:namedescription。一个读/写另一个只读。

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__()

0 个答案:

没有答案