python3 中抽象属性的强制执行

2023-11-29

我有这个抽象类

class Kuku(ABC): 
    def __init__(self): 
        self.a = 4 
    @property 
    @abstractmethod 
    def kaka(self): 
        pass 

kaka是一个抽象属性,所以我希望 python 强制它成为继承者中的一个属性,但它允许我创建:

class KukuChild(Kuku): 
     def kaka(self): 
         return 3

KukuChild().kaka() 返回 3,就好像它不是属性一样。这是故意的吗? Pycharm 也不强制执行此操作,那么为什么还要添加property抽象类中的装饰器?


我自己也遇到过这个问题,在研究了如何强制执行此类行为的选项之后,我提出了实现具有该类型检查的类的想法。

import abc
import inspect
from typing import Generic, Set, TypeVar, get_type_hints

T = TypeVar('T')


class AbstractClassVar(Generic[T]):
    pass


class Abstract(abc.ABC):
    """Inherit this class to:
        1. Enforce type checking for abstract properties.
        2. Check that abstract class members (aka. `AbstractClassVar`) are implemented.
    """

    def __init_subclass__(cls) -> None:

        def get_abstract_properties(cls) -> Set[str]:
            """Gets a class's abstract properties"""
            abstract_properties = set()
            if cls is Abstract:
                return abstract_properties
            for base_cls in cls.__bases__:
                abstract_properties.update(get_abstract_properties(base_cls))
            abstract_properties.update(
                {abstract_property[0] for abstract_property in
                 inspect.getmembers(cls, lambda a: getattr(a, "__isabstractmethod__", False) and type(a) == property)})
            return abstract_properties

        def get_non_property_members(cls) -> Set[str]:
            """Gets a class's non property members"""
            return {member[0] for member in inspect.getmembers(cls, lambda a: type(a) != property)}

        def get_abstract_members(cls) -> Set[str]:
            """Gets a class's abstract members"""
            abstract_members = set()
            if cls is Abstract:
                return abstract_members
            for base_cls in cls.__bases__:
                abstract_members.update(get_abstract_members(base_cls))
            for (member_name, annotation) in get_type_hints(cls).items():
                if getattr(annotation, '__origin__', None) is AbstractClassVar:
                    abstract_members.add(member_name)
            return abstract_members

        cls_abstract_properties = get_abstract_properties(cls)
        cls_non_property_members = get_non_property_members(cls)
        # Type checking for abstract properties
        if cls_abstract_properties:
            for member in cls_non_property_members:
                if member in cls_abstract_properties:
                    raise TypeError(f"Wrong class implementation {cls.__name__} " +
                                    f"with abstract property {member}")
        # Implementation checking for abstract class members
        if Abstract not in cls.__bases__:
            for cls_member in get_abstract_members(cls):
                if not hasattr(cls, cls_member):
                    raise NotImplementedError(f"Wrong class implementation {cls.__name__} " +
                                              f"with abstract class variable {cls_member}")
        return super().__init_subclass__()

Usage:

class Foo(Abstract):
    
    foo_member: AbstractClassVar[str]

    @property
    @abc.abstractmethod
    def a(self):
        ...

class UpperFoo(Foo):
    # Everything should be implemented as intended or else...
    ...
  1. 不实现抽象属性a或将其实现为除property(type) 将导致 TypeError
  2. 类成员的技巧完全不同,并使用更复杂的注释方法,但结果几乎相同。 没有实现抽象类成员foo_member将导致 NotImplementedError。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3 中抽象属性的强制执行 的相关文章

  • 为什么 Java 类不能声明为 static?

    我试图找出为什么该类不能创建为静态类 喜欢 public static class Qwert public static void main String args int x 12 while x lt 12 x System out
  • 如何从Python列表中删除单词

    到目前为止我已经完成了我的代码 但它无法与remove 一起正常工作 任何人都可以帮助我 Created on Apr 21 2015 author Pallavi from pip vendor distlib compat import
  • 从'_io.BytesIO'转换为python3.6中的类似字节的对象?

    我使用此函数来解压缩 HTTP 响应的正文 如果它是使用 gzip compress 或 deflate 压缩的 def uncompress body self compression type body if compression t
  • java中如何重写一个方法然后调用超类方法

    我试图重写我的 java 子类中的超类中的方法 然后从超类中调用重写的方法 这是正确的方法吗 我想要重写的超类中的方法称为describe public static void describe Item describe Use the
  • 熊猫不工作:DataFrameGroupBy;面板分组依据

    我刚刚升级了 python 但无法让 pandas 正常运行 请参见下文 似乎没有任何效果 回溯 最近一次调用最后一次 文件 Library Frameworks Python framework Versions 3 8 lib pyth
  • numba vstack 不适用于数组列表

    对我来说很奇怪的是 当输入是数组列表时 vstack 不能与 Numba 一起使用 它仅在输入是数组元组时才起作用 示例代码 nb jit nopython True def stack items return np vstack ite
  • 创建具有子级别的类属性

    我一直在读这个topic https excelmacromastery com vba class modules A Quick Guide to the VBA Class Module关于如何使用类模块 我的目标是提高代码性能和可读
  • 在 Pandas UDF PySpark 中传递多列

    我想计算 PySpark DataFrame 两列之间的 Jaro Winkler 距离 Jaro Winkler 距离可通过所有节点上的 pyjarowinkler 包获得 pyjarowinkler 的工作原理如下 from pyjar
  • Python 中的“私有”属性

    我对 Python 比较陌生 所以我希望我没有错过一些东西 但是这里 我正在尝试编写一个Python模块 并且我想创建一个具有 私有 属性的类 该属性只能 或者可能 应该 只能通过模块内的一个或多个函数进行修改 这是为了使模块更加健壮 因为
  • 如何使用类似 KDnuggets 风格的 PDF 绘制比较箱线图

    在经历了解 KDnuggets 文章中的箱线图 https www kdnuggets com 2019 11 understanding boxplots html 我找到了带有概率密度函数的箱线图的详细图 pdf 我正在尝试绘制比较箱线
  • Travis-ci 和 Gobject 内省

    我正在尝试设置 Travis获取 GNOME https github com getting things gnome gtg My travis yml https github com getting things gnome gtg
  • JavaScript 设置滚动高度

    在 JavaScript 中 将一个元素的滚动高度设置为另一个元素的滚动高度的正确方法是什么 直接赋值没有效果 谢谢 格雷格 直接是不可能的 scrollHeight 是一个只读属性 包含元素内容的总高度 以像素为单位 如果有元素 A 并且
  • 如何设置appache2的WSGI与python 3.7一起使用?

    我使用的是 ubuntu 16 04 并安装了 python 3 7 并使用以下说明将其设置为默认值 无法在 ubuntu 中将默认 python 版本设置为 python3 https stackoverflow com question
  • C++ 访问嵌套类的私有成员

    标题可能有点误导 我有以下问题 我有一棵由叶子和内部节点组成的树 用户应该能够在叶子中存储任何信息and该树有一些方法可以获取一组用户定义的值 并且需要在恒定时间内 未摊销 访问相应的叶子 我提出了以下想法 但它不起作用 因为不幸的是我无法
  • C# 错误 CS0201:只能将赋值、调用、递增、递减和新对象表达式用作语句

    这是我收到错误的行 activeType typeof Reticle 以下是如何Reticle类已定义 有些属性和方法可能没有多大意义 但我认为类的定义应该是关键问题 public class Reticle Shape region F
  • C++ 中的“助手”函数

    在重构一些旧代码时 我删除了许多实际上应该是静态的公共方法 因为它们a 不操作任何成员数据或调用任何其他成员函数 b 因为它们可能在其他地方有用 这让我思考将 辅助 功能组合在一起的最佳方法 Java C 方法是使用带有私有构造函数的静态函
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • pandas to_sql sqlalchemy 与 secure_transport 的连接

    我正在尝试将数据发送到具有 require secure transport ON 的服务器上的 mysql 数据库 当我尝试使用以下代码连接到它时 import pandas as pd import pymysql from sqlal
  • Python Camelot无边框表格提取问题

    我正在努力从 pdf 文件中提取一些无边框表格 如下图所示 我已经安装了 python camelot 如图所示here https github com socialcopsdev camelot并且仅适用于有边框的表格 请参阅以下详细信
  • Facebook Messenger 机器人的日期选择器 webview - 无法将字段值带回机器人的输入字段

    我正在使用 Dialogflow 和 Messenger 开发聊天机器人 Webhook 是用 Python 3 x 编写的 我面临着如何再次将数据从 webview 传输到信使聊天窗口以继续与用户对话的问题 Messenger 聊天机器人

随机推荐

  • MySQL SELECT 语句的两行之间的差异

    我试图区分 mysql 数据库中的两行 我有这张表 其中包含 ID 公里数 日期 car id car driver 等 由于我并不总是以正确的顺序在表中输入信息 因此我最终可能会得到如下信息 ID Kilometers date car
  • 在.NET中使用PerformanceCounter测量CPU使用率的正确方法

    我想在网络服务中衡量我的商务舱的性能 我怎样才能通过编码来做到这一点 我想知道我的业务类执行其操作需要消耗多少 CPU 以及如果 Web 服务同时获得多个服务调用 性能会如何变化 我不想衡量我的网络服务的性能 我只想知道我的商务舱表现如何
  • 空手道 - 无法传递正确的授权标头

    我在为我的 graphql 端点传递正确的标头时遇到一些问题 Postman 中的用例 调用 requestToken 端点获取 sessionToken 值 requestToken 响应包含 Key Value 和 Token Valu
  • 具有泛型变量的结构体方法

    我有以下使用泛型的代码 我知道泛型不能与方法一起使用 但可以与类型一起使用 从技术上讲 我的代码符合这两个限制 但我仍然收到错误 main go 12 9 cannot use generic type GenericCacheWrappe
  • Eclipse:自动完成类名时排除特定包

    在 Eclipse 中自动完成类名时 例如如果您输入 ListITab 将出现一个弹出菜单 为您提供匹配的类名称以供完成 您可以使用鼠标或使用箭头键进行选择 在这个例子中 我几乎肯定想要java util ListIterator我几乎从来
  • SAP 与 Xamarin 集成?

    我正在 Xamarin 平台上工作 我正在寻找 Xamarin 与 SAP 后端的集成 因此 任何人对此有任何了解 请在这里分享 我认为结合使用 SAP 和 Xamarin 的最佳方式是通过 ODATA ODATA 是您可以在 SAP 中创
  • 在seaborn中用中值标记箱线图

    如何使用中值标记 seaborn 图中的每个箱线图 E g import seaborn as sns sns set style whitegrid tips sns load dataset tips ax sns boxplot x
  • 以编程方式设置区域设置

    我的应用程序支持 3 种 很快将支持 4 种 语言 由于几个区域设置非常相似 我想为用户提供在我的应用程序中更改区域设置的选项 例如意大利人可能更喜欢西班牙语而不是英语 有没有办法让用户在应用程序可用的区域设置中进行选择 然后更改使用的区域
  • pyautocad 给出不可谷歌的错误

    OSError WinError 2147221005 无效的类字符串 完整回溯 During handling of the above exception another exception occurred Traceback mos
  • mypy:如何在泛型类中声明返回 self 的方法的返回类型?

    这个答案似乎不适用于泛型 在检查以下代码时 Mypy 抱怨 错误 缺少泛型类型 A 的类型参数 我尝试过使用 A T 对于 TypeVar 但 mypy 说 错误 类型变量 T 未绑定 我也尝试过使用AnyA T 作为返回类型get但这会产
  • 查找列表的平均值

    如何在 Python 中找到列表的平均值 1 2 3 4 2 5 对于 Python 3 8 请使用statistics fmean用于浮点数的数值稳定性 快速地 对于 Python 3 4 请使用statistics mean用于浮点数的
  • 如何将替代文本添加到背景图像?使背景图像易于访问

    我有一个网站 它使用以下方式将许多图像显示为背景图像background size cover调整它们的大小以完全填充元素 同时裁剪掉图像中不适合的任何部分 问题是这些图像并不纯粹是装饰性的 它们是页面信息内容的关键部分 这意味着他们需要a
  • Android 编程和框架/IDE 使用?

    我对 Android 编程很陌生 我主要是一个 NET 人员 我在 Windows Phone 上做过几个项目 我对 MVVM 模式 C 等感到非常满意 然而 我想进入Android开发 因为它是一个重要的平台 我想知道什么是最好的免费方法
  • 使用 r 进行微分

    我是使用 R 或任何类型的编程的新手 我正在尝试区分 3xcos xy 和 x 我尝试了四种不同的方法 想知道哪一种是最好 正确的 D expression 3 x cos xy x D expression 3 x cos xy x D
  • 为什么 put() 不打印一行?

    这是一段代码 def add a b a b end print Tell number 1 number1 gets to f print and number 2 number2 gets to f puts number1 numbe
  • 日期的 JSON 序列化策略

    我遇到的问题是我有一些消费者是Java 一些消费者是浏览器 我的目标浏览器是 IE7 json3 仅适用于 IE7 和 Chrome 对于浏览器 我希望将日期反序列化为DateJavaScript 对象 使用JSON parse 方法 对于
  • 浏览器 JavaScript 中的 new Date().getTime() 是否总是产生 UTC?

    我可以依赖 Date getTime 始终给出 UTC 毫秒数 还是取决于用户的浏览器设置 位置 系统时区 Date getTime 始终返回自纪元以来所有时区同时经历的毫秒数 该格式的日期没有时区 仅在显示期间使用 例如 对于var da
  • 如何在一列中搜索具有多个参数的LINQ?

    例如有这张表 Name BodyType John 1 Ted 2 Daniel 3 George 4 在我的应用程序中 我选中 1 2 和 3 复选框 我应该找到 3 行 约翰 泰德 丹尼尔 而不是乔治 我如何在 LINQ 中获取此查询
  • 按单位和百分比排列的堆积条形图

    Summary 我想显示一个条形图 其维度为天 堆叠类别为另一个 即 x 轴 天且堆栈 类别 1 但是 我不是显示每个组 堆栈的简单数量总和 而是显示想要显示一天的百分比 JSFiddle https jsfiddle net wostoj
  • python3 中抽象属性的强制执行

    我有这个抽象类 class Kuku ABC def init self self a 4 property abstractmethod def kaka self pass kaka是一个抽象属性 所以我希望 python 强制它成为继