当前位置: 首页 > 面试题库 >

如何在python抽象类中创建抽象属性

宇文弘懿
2023-03-14
问题内容

在以下代码中,我创建了一个基本抽象类Base。我希望所有继承自其的类都Base提供该name属性,因此我将该属性设置为@abstractmethod

然后,我创建了一个Base名为的子类,该子类Base_1旨在提供一些功能,但仍保持抽象。中没有name属性Base_1,但是python实例化了该类的对象而没有错误。一个人如何创建抽象属性?

from abc import ABCMeta, abstractmethod
class Base(object):
    __metaclass__ = ABCMeta
    def __init__(self, strDirConfig):
        self.strDirConfig = strDirConfig

    @abstractmethod
    def _doStuff(self, signals):
        pass

    @property    
    @abstractmethod
    def name(self):
        #this property will be supplied by the inheriting classes
        #individually
        pass


class Base_1(Base):
    __metaclass__ = ABCMeta
    # this class does not provide the name property, should raise an error
    def __init__(self, strDirConfig):
        super(Base_1, self).__init__(strDirConfig)

    def _doStuff(self, signals):
        print 'Base_1 does stuff'


class C(Base_1):
    @property
    def name(self):
        return 'class C'


if __name__ == '__main__':
    b1 = Base_1('abc')

问题答案:

从Python
3.3
开始,修复了一个错误,这意味着property()装饰器现在应用于抽象方法时,可以正确地标识为抽象。

注:订单的问题,你必须使用@property@abstractmethod

Python 3.3以上版本: (python
docs
):

class C(ABC):
    @property
    @abstractmethod
    def my_abstract_property(self):
        ...

Python 2: (python
docs

class C(ABC):
    @abstractproperty
    def my_abstract_property(self):
        ...


 类似资料:
  • 我通过学校为一项任务提供的简报创建了一个飞机座位预订系统。我遇到了一个我无法解决的主要问题。 摘要说明抽象类必须有一个抽象方法和大约4个公共方法。在抽象类的两个子类中,我们都必须初始化对象数组(所有普通的座位)。然而,一旦它们被初始化,我不知道如何将它们发送回抽象类(该类有一个检查未预订的飞机座位的方法,这就是我需要初始化的座位对象的地方) ArrayIndexOutOfBounds在一个应该在边

  • 问题内容: 如何在Python中使类或方法抽象? 我尝试像这样重新定义: 但是现在,如果我创建一个像这样继承的类: 那么我也无法实例化,因为它调用了其超类的方法。 有没有更好的方法来定义抽象类? 问题答案: 使用该模块创建抽象类。使用装饰器来声明方法摘要,并根据您的Python版本使用以下三种方式之一声明类摘要。 在Python 3.4及更高版本中,您可以从继承。在Python的早期版本中,您需要

  •   抽象用于向用户隐藏函数的内部功能。他们可以与函数交互并生成结果,但不知道结果是如何生成的。   简单来说,抽象就是用来对用户隐藏不相关的数据,以降低程序的复杂度。 在 Python 中借助 ABC 模块,我们可以实现抽象。   抽象类也可以作为其他类的基石,因为你不能为抽象类创建对象,所以访问元素的唯一方法是使用继承。

  • 问题内容: 在Python中使用抽象属性实现以下Scala代码的最短/最优雅的方法是什么? Scala编译器强制使用的子类来定义“路径”。子类如下所示: 问题答案: Python有一个内置的异常,尽管直到运行时您都不会遇到该异常。

  • 我需要做一个方法,可以添加这些数据类型到一个arraylist内的cart类。但如果我写 它只会接收推车类型的数据,所以我不能输入食物或饮料,或Miscs类型的数据,甚至有相同的细节,如名称和价格。