使用 __setattr__ 和 __getattr__ 与 __slots__ 进行委托,而不会触发无限递归

2024-02-02

class A:
    __slots__ = ("a",)
    def __init__(self) -> None:
        self.a = 1

class B1:
    __slots__ = ("b",)
    def __init__(self, b) -> None:
        self.b = b

    def __getattr__(self, k):
        return getattr(self.b, k)

    def __setattr__(self, k, v):
        setattr(self.b, k, v)

class B2:
    __slots__ = ("b",)
    def __init__(self, b) -> None:
        self.b = b

    def __getattr__(self, k):
        return getattr(super().__getattr__("b"), k)

    def __setattr__(self, k, v):
        setattr(super().__getattr__("b"), k, v)

class B3:
    __slots__ = ("b",)
    def __init__(self, b) -> None:
        self.b = b

    def __getattr__(self, k):
        return getattr(getattr(super(), "b"), k)

    def __setattr__(self, k, v):
        setattr(getattr(super(), "b"), k, v)

a = A()
b = B1(a)
print(b.a) # RecursionError: maximum recursion depth exceeded

b = B2(a)
print(b.a) # AttributeError: 'super' object has no attribute '__getattr__'

b = B3(a)
print(b.a) # AttributeError: 'super' object has no attribute 'b'

更合适的方法是检查属性名称是否在任何可用的名称中__slots__在委派之前向上提升类层次结构:

class BCorrect(object):
    __slots__ = ('b',)

    def __init__(self, b) -> None:
        self.b = b

    def _in_slots(self, attr) -> bool:
        for cls in type(self).__mro__:
            if attr in getattr(cls, '__slots__', []):
                return True
        return False

    def __getattr__(self, attr):
        if self._in_slots(attr):
            return object.__getattr__(self, attr)
        return getattr(self.b, attr)

    def __setattr__(self, attr, value):
        if self._in_slots(attr):
            object.__setattr__(self, attr, value)
            return
        setattr(self.b, attr, value)

这样做的优点是不会破坏继承并且不需要任何魔法__init__.

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

使用 __setattr__ 和 __getattr__ 与 __slots__ 进行委托,而不会触发无限递归 的相关文章

  • 如何将one-hot向量转换为多标签?

    我有一项多分类任务 并且我得到了像这样的单热类型预测 0 1 1 0 1 0 1 0 1 我希望将这个单热向量转换为标签 例如 1 2 1 0 2 我已经尝试过 tf argmax 但它不起作用 那么我该如何处理呢 使用列表理解 oheLi
  • 根据随机选择的列生成随机天数

    我有一个如下所示的数据框 感谢 SO 社区在以下方面提供的帮助 df1 pd DataFrame person id 11 11 12 13 14 date birth 01 01 1961 12 30 1961 05 29 1967 01
  • 在 python 2 和 3 的spyder之间切换

    根据我在文档中了解到的内容 它指出您只需使用命令提示符创建一个新变量即可轻松在 2 个 python 环境之间切换 如果我已经安装了 python 2 7 则 conda create n python34 python 3 4 anaco
  • Pytest:如何使用从夹具返回的列表来参数化测试?

    我想使用由固定装置动态创建的列表来参数化测试 如下所示 pytest fixture def my list returning fixture depends on other fixtures return a dynamically
  • 如何在 openpyxl 中设置或更改表格的默认高度

    我想通过openpyxl更改表格高度 并且我希望首先默认一个更大的高度值 然后我可以设置自动换行以使我的表格更漂亮 但我不知道如何更改默认高度 唯一的到目前为止 我知道更改表格高度的方法是设置 row dimension idx heigh
  • 我有一个 Employee 类,我想返回“姓名”列表

    我有一个 Employee 类 我想返回 姓名 列表 雇员 py class Employee object def init self id name members None self id id self name name self
  • Python time.sleep - 永不醒来

    我认为这将是那些简单的问题之一 但它让我感到困惑 停止媒体 我是对的 找到了解决方案 查看答案 我正在使用 Python 的单元测试框架来测试多线程应用程序 很好而且很直接 我有 5 个左右的工作线程监视一个公共队列 以及一个为它们制作工作
  • 与函数复合 UniqueConstraint

    一个快速的 SQLAlchemy 问题 我有一个 文档 类 其属性为 数字 和 日期 我需要确保没有重复的号码同年 是 有没有办法对 数字 年份 日期 进行UniqueConstraint 我应该使用唯一索引吗 我如何声明功能部分 SQLA
  • 从 Apache 运行 python 脚本的最简单方法

    我花了很长时间试图弄清楚这一点 我基本上正在尝试开发一个网站 当用户单击特定按钮时 我必须在其中执行 python 脚本 在研究了 Stack Overflow 和 Google 之后 我需要配置 Apache 以便能够运行 CGI 脚本
  • PermanentTaskFailure:“模块”对象没有属性“迁移”

    我在 google appengine 上使用 Nick Johnson 的批量更新库 http blog notdot net 2010 03 Announcing a robust datastore bulk update utili
  • python 中的基本矩阵转置

    我尝试了 python 中矩阵转置的最基本方法 但是 我没有得到所需的结果 接下来是代码 A 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 print A def TS A B A for i in range len A
  • django如何将字符串转换为模块?

    我试图了解 django 的另一个神奇之处 它可以将字符串转换为模块 In settings py INSTALLED APPS声明如下 INSTALLED APPS django contrib auth django contrib c
  • 使用 pandas 绘制带有误差线的条形图

    我正在尝试从 DataFrame 生成条形图 如下所示 Pre Post Measure1 0 4 1 9 这些值是我从其他地方计算出来的中值 我还有它们的方差和标准差 以及标准误差 我想将结果绘制为具有适当误差线的条形图 但指定多个误差值
  • 本地设置的 Cython 编译器指令是否影响一个或所有函数?

    我正在努力使用 Cython 加速一些 Python Numpy 代码 并且对 本地 设置 如定义的here http docs cython org en latest src reference compilation html在文档中
  • SpaCy 中的自定义句子边界检测

    我正在尝试在 spaCy 中编写一个自定义句子分段器 它将整个文档作为单个句子返回 我编写了一个自定义管道组件 它使用以下代码来执行此操作here https github com explosion spaCy issues 1850 但
  • scrapy python 请求未定义

    我在这里找到了答案 code for site in sites Link site xpath a href extract CompleteLink urlparse urljoin response url Link yield Re
  • Python“self”关键字[重复]

    这个问题在这里已经有答案了 我是 Python 新手 通常使用 C 最近几天开始使用它 在类中 是否需要在对该类的数据成员和方法的任何调用前添加前缀 因此 如果我在该类中调用方法或从该类获取值 我需要使用self method or sel
  • 如何将 Pandas Dataframe 中的字符串转换为字符列表或数组?

    我有一个名为的数据框data 其中一列包含字符串 我想从字符串中提取字符 因为我的目标是对它们进行一次性编码并使之可用于分类 包含字符串的列存储在预测因子如下 predictors pd DataFrame data columns Seq
  • 如何抑制 Pandas Future 警告?

    当我运行该程序时 Pandas 每次都会给出如下所示的 未来警告 D Python lib site packages pandas core frame py 3581 FutureWarning rename with inplace
  • Python - 打印漂亮的 XML 为空标签文本创建开始和结束标签

    我正在编写一个 python 应用程序 它创建一个 ElementTree XML 然后使用 minidom 的 toprettyxml 将其写入文件 final tree minidom parseString ET tostring r

随机推荐

  • 如何管理A-Frame使用的内存?

    我正在构建一个 Web 应用程序 它将 360 度图像加载到天空基元中 我在用着aframe react 总共有20 张360度的图片 只有一张img里面的资产a assets 一旦用户切换场景反应就会改变src资产的img并且场景将重新渲
  • 用数据填充 JList

    有没有人有关于如何填写的好的教程JList 在一个JPanel 与用户输入的数据 具体来说 我想将人员添加到选定的名册中 这是一个用一个填充它的问题吗 ArrayList 任何帮助将非常感激 创建一个 ListModel 来包装您的 jav
  • 在 Unity 2D 中移动简单对象

    我正在尝试移动一个简单的Object在 Unity 中 但我收到以下错误消息 cannot modify the return value of unityengine transform position because itar is
  • 如何以编程方式创建 SQL Server 视图的 ODBC 链接表并使其可编辑?

    当我使用向导创建到 SQL Server 的 DSN 连接时 我可以将其链接到视图 在这种情况下 Access 将其识别为可编辑表 但是 如果我使用 vba 代码对视图使用无 DSN 连接 方法 1 来自https support micr
  • 阿特金筛

    我一直在尝试学习生成素数的算法 并且在维基百科上发现了阿特金筛法 除了少数几个部分之外 我几乎理解该算法的所有部分 以下是问题 下面的三个二次方程是如何形成的 4x 2 y 2 3x 2 y 2 和 3x 2 y2 维基百科中的算法讨论了模
  • malloc(1) 的对齐要求是什么

    我听说成功调用malloc 返回适合任何类型对齐的指针 然而 要求这样做似乎毫无用处且浪费 malloc 1 返回一个指针 其对齐值大于1因为没有物体大于char可以存储到块中 对齐要求是什么malloc 1 malloc 2 etc 如果
  • 如何检测android内存不足?

    我的应用程序有很多图像 有时会由于内存不足而崩溃 我编写了在开发人员网站上找到的这个函数 public void onLowMemory 但问题是 在内存不足的情况下 这个函数永远不会被调用 我应该怎么做才能调用这个函数 当用户设备内存不足
  • 不再支持 android.useDeprecatedNdk=true

    I try to use OpenCv to build a facetracking camera app but I have a problem when I set up my OpenCv I have this error 我用
  • 如何使用/启用动画图标?

    有谁知道如何在 Angular Web 应用程序中使用 启用材料设计文档中显示的动画图标 https material io design iconography animated icons html usage https materi
  • R 和 scikit-learn 在逻辑回归分类任务中的比较

    我正在做 James Witten Hastie Tibshirani 2013 所著的 R 应用统计学习简介 一书中描述的逻辑回归 更具体地说 我将二元分类模型拟合到第 7 8 1 节中描述的 R 包 ISLR 中的 工资 数据集 预测变
  • 是否可以在 Visual Studio 中加载不匹配的符号?

    我有一个 Windows 小型转储 C 代码 和一个相应的 exe 文件 不幸的是 我没有完全匹配的 pdb 文件 但我确实有 pdb 其中包含在不同时间构建的完全相同的代码 在 Windbg 中 我可以使用 symopt 0x40 告诉它
  • 将双数四舍五入到十分位[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的 float 函数 https stackoverflow com questions 485525 round for float in c 好吧 假设我有电话号码8 47434 我想将其四
  • ts1206 装饰器在这里无效,Angular 2

    我开始编写 Angular 2 程序 但遇到了一个错误 ts1206 装饰器在这里无效 Component ts1206 decorators are not valid here selector my app moduleId modu
  • pandas 在重复 DataFrame.reset_index() 时崩溃

    这里有一个非常奇怪的错误 我正在使用 pandas 来合并多个数据帧 作为合并的一部分 我必须多次调用reset index 但是当我这样做时 它会在第二次或第三次使用 reset index 时意外崩溃 这是重现错误的最少代码 impor
  • 使用 google Sheets api 无需客户端登录

    我有一个从 Google 电子表格中获取数据的网站 我希望我的用户无需登录即可查看获取的数据 这可能吗 如何实现 为了获取和更新工作表数据 我只需要一个帐户 最好在服务器端登录 但是 我还没有看到任何不需要客户端登录的服务器端日志记录 以此
  • CORS - Facebook - 护照

    我正在尝试在我的 Nodejs Angular Express Passport 应用程序中通过 Facebook 实现 OAUTH 登录 但我对此很挣扎 我仍然收到 CORS 错误 XMLHttpRequest 已被 CORS 策略阻止
  • 使用 Spark 和 Java 进行分层采样

    我想确保我正在对数据的分层样本进行训练 Spark 2 1 及更早版本似乎支持这一点JavaPairRDD sampleByKey and JavaPairRDD sampleByKeyExact 正如所解释的here https spar
  • NextJS api 路由中的文件路径无法解析

    我正在尝试解析文件路径NextJS https nextjs org 我明白那个API路线 https nextjs org docs api routes introduction部署到 Vercel 时 工作方式略有不同 为了创建文件的
  • 使用子查询的 Sqlite 更新查询

    我必须更新表 test test 列 testconsent id 与表的 id 值test groupedconsent 哪里的patient id in test test and patient id in test groupedc
  • 使用 __setattr__ 和 __getattr__ 与 __slots__ 进行委托,而不会触发无限递归

    class A slots a def init self gt None self a 1 class B1 slots b def init self b gt None self b b def getattr self k retu