如何使用 __getattr__ 来制作可供选择的课程

2023-12-20

如何修改下面的类以使其可供选择?

这个问题:如何使 __getattr__ 可以正确选择的类? https://stackoverflow.com/questions/42272335/how-to-make-a-class-which-has-getattr-properly-pickable类似,但在使用中引用了错误的异常getattr.

这另一个问题似乎提供了有意义的见解为什么 pickle.dumps 调用 __getattr__ ? https://stackoverflow.com/questions/12101574/why-does-pickle-dumps-call-getattr,但是它未能提供示例,而且我真的无法理解我应该实现什么。

import pickle
class Foo(object):
    def __init__(self, dct):
        for key in dct:
            setattr(self, key, dct[key])


class Bar(object):
    def __init__(self, dct):
        for key in dct:
            setattr(self, key, dct[key])

    def __getattr__(self, attr):
        """If attr is not in channel, look in timing_data
        """
        return getattr(self.foo, attr)

if __name__=='__main__':
    dct={'a':1,'b':2,'c':3}
    foo=Foo(dct)
    dct2={'d':1,'e':2,'f':3,'foo':foo}
    bar=Bar(dct2)
    pickle.dump(bar,open('test.pkl','w'))
    bar=pickle.load(open('test.pkl','r'))

Results:

     14         """If attr is not in channel, look in timing_data
     15         """
---> 16         return getattr(self.foo, attr)
     17
     18 if __name__=='__main__':

RuntimeError: maximum recursion depth exceeded while calling a Python object

这里的问题是你的__getattr__方法执行得不好。它假设self.foo存在。如果self.foo不存在,尝试访问它最终会调用__getattr__- 这会导致无限递归:

>>> bar = Bar({})  # no `foo` attribute
>>> bar.x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "untitled.py", line 19, in __getattr__
    return getattr(self.foo, attr)
  File "untitled.py", line 19, in __getattr__
    return getattr(self.foo, attr)
  File "untitled.py", line 19, in __getattr__
    return getattr(self.foo, attr)
  [Previous line repeated 329 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

要解决此问题,如果没有,则必须抛出 AttributeErrorfoo属性存在:

def __getattr__(self, attr):
    """If attr is not in channel, look in timing_data
    """
    if 'foo' not in vars(self):
        raise AttributeError
    return getattr(self.foo, attr)

(我用的是vars https://docs.python.org/3/library/functions.html#vars函数来获取对象的字典,因为它看起来比self.__dict__.)


现在一切都按预期进行:

dct={'a':1,'b':2,'c':3}
foo=Foo(dct)
dct2={'d':1,'e':2,'f':3,'foo':foo}
bar=Bar(dct2)
data = pickle.dumps(bar)
bar = pickle.loads(data)
print(vars(bar))
# output:
# {'d': 1, 'e': 2, 'f': 3, 'foo': <__main__.Foo object at 0x7f040fc7e7f0>}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 __getattr__ 来制作可供选择的课程 的相关文章

随机推荐

  • 如何在Turbo c++ 4.0中读取文件中的数据?

    我是编程初学者 我正在尝试编写一个从文件中读取 2 个数字的代码 然后 将其显示在 Turbo C 的输出窗口中 我的代码仅读取第一个数字并产生错误的输出 对于第二个数字 include
  • 如何用纯 SQL 编写 LINQ 的 .Skip(1000).Take(100) ?

    SQL 的等价物是什么 Skip LINQ 中的方法 例如 我想从特定数据库表中选择第 1000 1100 行 只用 SQL 就可以做到这一点吗 或者我是否需要选择整个表 然后在内存中查找行 如果可能的话 我希望避免这种情况 因为桌子可能很
  • iPad 分屏视图更改主导航栏颜色

    奇怪的问题 将我的应用程序旋转到纵向 选择工具栏项目并公开 uipopovercontroller 后 如果我旋转回横向 右侧的 UINavigationController SplitView 的 objectAtIndex 0 会更改导
  • “简单表单”的 asp.net mvc 模型继承

    你将如何实施这个 我有以下模型 class Something public string Label get set public DateTime Date1 get set class SomethingStage2 Somethin
  • ASP.NET MVC 跟踪问题

    Question 如何使 ASP NET MVC 跟踪信息与作为 Trace axd 的页内跟踪输出保持一致 我可能遗漏了一些明显的东西 如果你看到它 请指出 传统 ASP NET 的背景信息 因此 回到常规的 ASP NET 时代 您只需
  • cygwin 如何/为何破坏 Windows 权限?

    我们收到 来自现场 即来自安装软件的系统管理员 的投诉 称 cygwin 搞乱 了 NTFS 上的 Windows 权限 Windows 7 10 2008 2012 等 问题用例 一般用例是这样的 系统管理员从 cygwin bash c
  • PyCharm,某些包无法导入Pandas,ImportError:C扩展:StringIO未构建

    我遇到一个非常奇怪的错误并且无法解决它 我有一个具有以下目录结构的项目 ptouch ptouch init py ptouch py io py tests init py tests py 我正在使用 PyCharm 社区版和 Anac
  • 文档字符串中的重复内容

    处理文档字符串中重复内容的好方法是什么 我有许多采用 标准 参数的函数 这些参数必须在文档字符串中进行解释 但是最好只编写文档字符串的相关部分一次 因为这会更容易维护和更新 我天真地尝试了以下方法 arg a a a very common
  • OData v4.0 聚合查询(聚合查询语法)

    例如 我有一个对象模型 Product int ProductId string Name List
  • 如何在MySql SELECT语句中正确使用CAST函数?

    我正在将 MSSQL DB 转换为 MySQL DB 并且有一个存储过程使用强制转换函数从 datetime 数据类型转换为 varchar 数据类型 无论这在 php mysql 中是否重要 因为 php 不是强类型的 我不知道这是否重要
  • 使用 python 解析 Outlook .msg 文件

    环顾四周 没有找到满意的答案 有谁知道如何使用 Python 解析 Outlook 中的 msg 文件 我尝试使用 mimetools 和 email parser 但没有成功 帮助将不胜感激 这对我有用 import win32com c
  • 使用Python控制屏幕

    有没有办法用 python 控制屏幕 显示器 例如将其关闭然后再次打开 类似于笔记本电脑键盘上的快捷按钮 谢谢你 大多数现代笔记本电脑的按钮和显示器之间都有物理连接 例如 我的戴尔 Precision i 甚至可以在 BIOS 启动之前启动
  • Apache 在 Glassfish v3 前面使用 mod_proxy_ajp 使用 SSL

    我希望这里有一些裂缝可以轻松解决我在几个论坛中搜索后遇到的问题 我需要将 Glassfish v3 应用程序服务器放在 Apache 2 2 x Web 服务器后面 作为我的 Web 托管商提供的一些部分 例如 Webmail 正在网络服务
  • python多处理映射对最后一个进程的错误处理

    有一种奇怪的行为map当使用Python的时候multiprocessing Pool 在下面的示例中 4 个处理器的池将处理 28 个任务 这应该需要七次通过 每次需要 4 秒 然而 需要8次通过 在前六次中 所有处理器都处于工作状态 在
  • 打印带有即时生成的 PDF 的 Iframe IE 11

    我想打印在 Iframe 中动态生成的 pdf 但无法打印此 pdf 文件 这就是我现在所拥有的 我做错了什么吗 在 Google Chrome 上工作正常 但在 IE 11 上不行 请帮助我完成这项工作 提前致谢 这是 HTML 标记 d
  • hdpi ldpi mdpi 图标/菜单分辨率

    我想为我的应用程序设置一个图标 但不知道放入三个文件夹 hdpi ldpi mdpi 的确切分辨率 另外我想为我的菜单选项设置图标 但不知道要应用什么分辨率 感谢您的帮助 启动器图标 48 48 mdpi 72 72 hdpi 96 96
  • @Autowired 不应该在没有 @RunWith(SpringRunner.class) 的情况下工作,但确实如此

    这是 java spring 数据存储库层的单元测试类 我有一个 spring 数据存储库层 其中使用注释 Autowired 注入 TestEntityManager 类型对象 属于 spring 数据包 自动装配工作无需添加 RunWi
  • 使用 Excel 中的排名函数

    很抱歉 如果这个问题已经得到解答 我觉得可能有 但我正在努力寻找一个可以帮助我走向成功的答案 我有一个计时赛结果的基本电子表格 该电子表格适用于男性和女性 基本上 所有参赛者中以 30 秒为间隔的最快时间都会获得积分 这很好 Cloumn
  • 检查对象是否与给定列表中的任何类型匹配的替代方法

    if this Page is ArticlePage this Page is ArticleListPage Do something fantastic 上面的代码有效 但考虑到我可能想比较许多不同的类this Page到 我想将类存
  • 如何使用 __getattr__ 来制作可供选择的课程

    如何修改下面的类以使其可供选择 这个问题 如何使 getattr 可以正确选择的类 https stackoverflow com questions 42272335 how to make a class which has getat