如何在Python抽象类中创建抽象属性?

2023-11-21

在下面的代码中,我创建了一个基本抽象类Base。我想要继承自的所有类Base提供name财产,所以我把这个财产@abstractmethod.

然后我创建了一个子类Base,称为Base_1,它旨在提供一些功能,但仍然保持抽象。没有name财产在Base_1,但是 python 会毫无错误地实例化该类的对象。如何创建抽象属性?

from abc import ABCMeta, abstractmethod

class Base(object):
# class Base(metaclass = ABCMeta): <- Python 3
    __metaclass__ = ABCMeta
    def __init__(self, str_dir_config):
        self.str_dir_config = str_dir_config
    
    @abstractmethod
    def _do_stuff(self, signals):
        pass
    
    @property    
    @abstractmethod
    def name(self):
        """This property will be supplied by the inheriting classes
        individually.
        """
        pass
    

class Base1(Base):
    __metaclass__ = ABCMeta
    """This class does not provide the name property and should
    raise an error.
    """
    def __init__(self, str_dir_config):
        super(Base1, self).__init__(str_dir_config)
        # super().__init__(str_dir_config) <- Python 3
    
    def _do_stuff(self, signals):
        print "Base_1 does stuff"
        # print("Base_1 does stuff") <- Python 3

class C(Base1):
    @property
    def name(self):
        return "class C"
    

if __name__ == "__main__":
    b1 = Base1("abc")

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

注意:顺序很重要,您必须使用@property above @abstractmethod

Python 3.3+: (蟒蛇文档):

from abc import ABC, abstractmethod

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

Python 2: (蟒蛇文档)

from abc import ABCMeta, abstractproperty

class C:
    __metaclass__ = ABCMeta

    @abstractproperty
    def my_abstract_property(self):
        ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python抽象类中创建抽象属性? 的相关文章

随机推荐

  • Delphi:确定泛型的实际类型?

    有什么方法可以确定作为参数传递给方法的变量的类型吗 考虑一下这个类 TSomeClass class procedure AddToList
  • 如何检查 mysqli_query 是否删除了任何行[重复]

    这个问题在这里已经有答案了 我创建了从数据库中删除一些数据的函数 这是其中的一部分 mysqli query con DELETE FROM appsdata WHERE ownerID 123 但我想检查删除了多少行 mysql quer
  • 通过查找/替换 (Ctrl+F) 删除 Eclipse 代码编辑器中的空行

    我想通过 Eclipse 代码编辑器中的查找 替换方法从代码中删除所有空白行 我使用了正则表达式 n s n找到所有空白行但出现错误 Incompatible line delimiter near index 55110 用任何字符串替换
  • 如何获取特定类型类实例的多态函数的类型?

    例如 输入 t ap在 GHCi 中给出结果 ap Monad m gt m a gt b gt m a gt m b 如果我已经知道我要使用的 Monad 实例是 gt r 如何查询类型ap对于那个特定的例子 As 激光烟说作为评论你可以
  • 使用 Eclipse/Tomcat 自动将第 3 方 jar 添加到 WEB-INF/lib [重复]

    这个问题在这里已经有答案了 我在 Eclipse 上设置了一个动态 Web 项目 并使用 Tomcat 7 作为我的 Web 服务器 它似乎不会自动将我添加到构建路径上的库中的第 3 方 JAR 放入 WEB INF lib 文件夹中 有没
  • 创建 IE 插件

    我正在寻找为 IE 8 或 9 制作插件的教程 你能给我提供资源吗 拜托 为了和平和其他一切 我已经知道我可以制作 FF 或 Chrome 插件 我want制作一个 IE 插件 Thanks 你见过吗这个网站
  • 如何使 C# 枚举与数据库中的表保持同步

    这是一个稍微简化的示例 我对其进行了更改以隐藏实际代码 我有一个数据库驱动的应用程序和一个单独开发的小工具 旨在与该应用程序一起使用 有一个表定义了枚举 但它可能会随着时间的推移而改变 假设某个应用程序 医疗 需要相当精确地跟踪一个人的性别
  • WPF 用户控件上下文菜单可见性绑定

    我的用户控件上下文菜单可见性无法绑定依赖属性 任何想法 这是我的 WPF 代码
  • 如何在C#中多次使用StopWatch?

    我有执行不同操作的简短代码 我想测量执行每个操作所需的时间 我在这里阅读了有关秒表类的信息 并且想要优化我的时间测量 我的函数调用了 5 个其他函数 我想在不声明的情况下测量每个函数 stopwatch sw1 new stopwatch
  • 将 C# 对象发送到 webapi 控制器

    我正在尝试将 C 对象传递给 Web api 控制器 该 API 配置为存储发布到它的 Product 类型的对象 我已经使用 Jquery Ajax 方法成功添加了对象 现在我尝试在 C 中获得相同的结果 我创建了一个简单的控制台应用程序
  • 在appendChild之后添加事件监听器

    我创建一个元素 eltTooltip with document createElement等等并将其添加到 DOM 像这样 idTooltip包含id of eltTooltip document body appendChild elt
  • 如何在 java SSL 客户端应用程序中支持多个 TrustStore

    在我们的 java 应用程序中 我们需要使用 https 协议与 SSL 上的服务器列表进行通信 要通信的服务器列表将在运行时更改 最初我们没有任何服务器的证书 在运行时 我们将获取新的服务器证书并将公钥证书添加到信任库中 并且与服务器的任
  • 在 swift 中按串行顺序同步多个 Web 服务调用

    我点击 Web 服务 URL 10 次并得到响应 我在用Alamofire and SwiftyJSON 这是我的控制器代码 class ViewController UIViewController let dispatchGroup D
  • 从 ssl 迁移到非 ssl 时,会话不保存

    我有一个强制使用 ssl 的登录屏幕 如下所示 https www foobar com login然后他们登录后 就会转到主页 https www foobar com dashbaord 但是 我希望人们在登录后就不再使用 SSL 以节
  • z3python:将字符串转换为表达式

    鉴于x y z Ints x y z 和一个像这样的字符串s x y 2 z 5 有没有快速的方法将 s 转换为 z3 表达式 如果不可能 那么我似乎必须执行大量字符串操作才能进行转换 您可以使用Pythoneval功能 这是一个例子 fr
  • Rails:完全被delayed_job难住了。在任何地方都没有收到参数

    我正在尝试使用collectiveidea 的delayed job 在Rails 3 应用程序中发送邮件 如果我尝试定期发送邮件 deliver 它工作正常 但一旦我切换到延迟工作 事情就会崩溃 我在delayed job mysql表中
  • 如何使用 Json.NET 将 XML 序列化为 JSON 对象

    我可以将 XML 序列化为 JSON 字符串 如下所示 var xml new XmlDocument xml LoadXml
  • Javascript 在操作 DOM 时是同步的吗?

    我有一个带有类型字段输入的表单 我有几个单选按钮 根据我单击的单选按钮 输入类型字段中的值将会更新 之后 我将调用 Javascript 函数来执行某些操作 该函数将使用输入字段中更新的数量 文本 当然 将该数量传递给函数本身更安全 但是我
  • 如何在悬停时为元素设置动画

    我怎样才能让我的 div 当鼠标悬停在元素上时 元素会增长 并且内容会将文本大小更改为更大的大小 我把它们放在一个类中并尝试 size 150 and height 30px width 30px 第一次尝试根本不起作用 第二次代码只是让
  • 如何在Python抽象类中创建抽象属性?

    在下面的代码中 我创建了一个基本抽象类Base 我想要继承自的所有类Base提供name财产 所以我把这个财产 abstractmethod 然后我创建了一个子类Base 称为Base 1 它旨在提供一些功能 但仍然保持抽象 没有name财