如何将带槽的 python 类转换为字典?

2023-11-27

我使用带有插槽的类来减少实例占用的内存。现在,如何将插槽实例转换为字典?

插槽类如下所示:

class Foo(object):
       __slots__ = ['x','y','z']
       def __init__(self):
           self.x = 1
           self.y = 2 
           self.z = 3

我期望这样的事情:

y = Foo()
y.__dict__
{'x': 1, 'y': 2, 'z': 3}

Use the __slots__属性加成getattr()在字典理解中:

{
    s: getattr(obj, s)
    for s in {
        s
        for cls in type(obj).__mro__
        for s in getattr(cls, '__slots__', ())
    }
    if hasattr(obj, s)
}

它从所有基类收集插槽名称并跳过任何未设置的属性。

或者,将缺失的属性设置为None:

{
    s: getattr(obj, s, None)
    for s in {
        s
        for cls in type(obj).__mro__
        for s in getattr(cls, '__slots__', ())
    }
}

Demo:

>>> class Foo(object):
...     __slots__ = ('bar', 'spam')
... 
>>> obj = Foo()
>>> obj.bar = 42
>>> {s: getattr(obj, s) for s in {s for cls in type(obj).__mro__ for s in getattr(cls, '__slots__', ())} if hasattr(obj, s)}
{'bar': 42}
>>> {s: getattr(obj, s, None) for s in {s for cls in type(obj).__mro__ for s in getattr(cls, '__slots__', ())}}
{'spam': None, 'bar': 42}

您甚至可以将其作为班级的财产vars()将利用它:

>>> class Foo(object):
...     __slots__ = ('bar', 'spam')
...     @property
...     def __dict__(self):
...         return {
...             s: getattr(self, s)
...             for s in {
...                 s
...                 for cls in type(self).__mro__
...                 for s in getattr(cls, '__slots__', ())
...             }
...             if hasattr(self, s)
...         }
... 
>>> f = Foo()
>>> f.bar = 42
>>> f.__dict__
{'bar': 42}
>>> f.spam = 'eggs'
>>> f.__dict__
{'spam': 'eggs', 'bar': 42}
>>> vars(f)
{'spam': 'eggs', 'bar': 42}
>>> f.hello = 'world'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'hello'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将带槽的 python 类转换为字典? 的相关文章

随机推荐

  • Flutter 中的 VoidCallback 是如何工作的?

    我从互联网上了解到的信息是无效回调 是不带参数也不返回任何参数的函数 以下代码来自应用程序 并且该应用程序运行良好 我想问一下使用 VoidCallback 作为type而不是作为function 我是 Flutter 开发的绝对初学者 请
  • _int64 没有命名类型

    In my pch文件我有以下定义 if MSC VER lt 1300 typedef signed char int8 t typedef signed short int16 t typedef signed int int32 t
  • 如何使用javascript调用按钮点击事件背后的代码

    是否可以使用 javascript 或 jquery 调用服务器端按钮单击事件 如果是的话该怎么做 假设这是你的 html
  • 检查浏览器通知是否可用

    我正在处理浏览器通知 因为它不适用于我想签入的每个浏览器JS code 如果可用的话 我查看了 Mozilla 开发者部分 https developer mozilla org en US docs Web API Notificatio
  • JQuery 多个选择器,$(this) 引用?

    鉴于以下 identifier div first idetifier2 fadeOut 300 function I need to reference just the identifier div first element howe
  • 递归计算 DataFrame 值

    我正在尝试 递归 计算 pandas 数据框的列值 假设有两个不同日期的数据 每个日期有 10 个观测值 并且您想要计算某个变量 r 其中仅给出 r 的第一个值 每天 并且您想要计算剩余的 2 9 条目 而每个后续值取决于在 r 的前一个条
  • 如何按第一维对张量进行排序

    我有一个 2D 张量 我想按第一个维度排序 如下例所示 a torch FloatTensor 5 5 5 3 3 5 6 4 3 7 我预计排序后的结果是这样的 a torch FloatTensor 3 5 3 7 5 3 5 5 6
  • 尝试对 var/www/html 使用符号链接

    这就是我想要实现的目标 从中创建符号链接var www html到主目录中的目录 文件夹 我试图在 home 中符号链接到的目录 是一个 git 存储库 如果这有什么区别的话 我在这个目录中有一个index html 文件 我使用以下命令在
  • 如何在 MySQL 中插入大量行?

    例如 如何使用单个查询将 100 000 行插入 MySQL 表中 insert into table values 1 a b 2 c d 3 e f 这将执行 3 行的插入 根据需要继续达到 100 000 在进行 ETL 工作时 我会
  • 使用元类理解 __call__ [重复]

    这个问题在这里已经有答案了 据我了解 call 类中的方法实现了函数调用运算符 例如 class Foo def init self print I m inside the init method def call self print
  • 在Linux Ubuntu下启动时自动运行程序[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 每次启动 Ubuntu Linux 时我都需要运行一个程序 所以我需要将其添加到我的启动程序列表中 只有一个问题 我需要通过终端来完成此操作 sudo mv filename etc
  • 使用 jquery 根据
    标签拆分字符串

    我如何分割包含的字符串 br 使用 jquery 进行标记 我尝试了以下代码 但在控制台中出现错误 我不知道如何根据分割字符串 br 标签 这是我尝试过的代码 jQuery document ready function var lines
  • 如何计算一个数字最接近的 2 或 10 次方?

    计算 2 或 10 与另一个数字最接近的幂的最有效方法是什么 例如 3 5 对于 2 的幂返回 4 对于 10 的幂返回 1 123 将返回 2 的幂 128 和 10 的幂 100 0 24 对于 2 的幂返回 0 25 对于 10 的幂
  • 如何从内核树构建 BPF 程序

    内核提供了许多示例samples bpf 我有兴趣在树之外构建一个示例 就像我们构建一个内核模块一样 其中Makefile可以很简单 是否可以对 bpf 执行相同的操作 我尝试从中删除不必要的部分samples bpf Makefile并保
  • 如何在 Java Web 应用程序中获取服务器名称

    我有一个 Web 应用程序 用户将其部署在自己的 Java Web 服务器 例如 Tomcat 上 Web 应用程序的 Java 端需要报告 Web 应用程序本身的 URL 例如http aServer com 8080 MyApp or
  • 计算 PowerShell 中的字符数、单词数和行数

    在 Linux 中 我们有 wc 命令 它允许我们计算文件中的字符数 单词数和行数 但是我们在 PowerShell 中是否有类似的 cmdlet 我尝试的 Measure Object cmdlet 只能计算行数 而不能计算字符和单词数
  • Pandas:如何查找每个子组的组成员类型百分比?

    问题末尾的数据样本和尝试 使用这样的数据框 Type Class Area Decision 0 A 1 North Yes 1 B 1 North Yes 2 C 2 South No 3 A 3 South No 4 B 3 South
  • 如何使用 Shapeless 迭代联产品中的所有产品类型?

    假设我有一个副产品 密封特征 例如 sealed trait Traity case object Foo extends Traity case class Bar extends Traity case class Baz extend
  • 转义 utf-8 json 上的重音字符

    下面的代码产生以下输出 x Art 120 Incapacit di intendere o di volere 我需要对此进行更改 我想我必须更改编码上的某些内容 但我不知道是什么 x Art 120 Incapacit u00e0 di
  • 如何将带槽的 python 类转换为字典?

    我使用带有插槽的类来减少实例占用的内存 现在 如何将插槽实例转换为字典 插槽类如下所示 class Foo object slots x y z def init self self x 1 self y 2 self z 3 我期望这样的