python - 自定义类是一个 dict,但没有 dict 副本初始化?

标签 python dictionary inheritance

出于易读性目的,我想要一个自定义类,它的行为与字典完全一样(但带有有意义的类型而不是更通用的字典类型):

class Derivatives(dict):
    "Dictionary that represents the derivatives."

现在,有没有一种不涉及副本的方式来构建此类的新对象?天真的用法

derivs = Derivatives({var: 1})  # var is a Python object

实际上创建了作为参数传递的字典的副本,出于效率原因,我想避免这种情况。

我试图绕过复制,但在 CPython 中无法更改字典的类:

class Derivatives(dict):
    def __new__(cls, init_dict):
        init_dict.__class__ = cls  # Fails with __class__ assignment: only for heap types
        return init_dict

我希望能够为程序操作的字典提供显式类名构建此类字典的有效方法(而不是被迫复制 Python 字典) .这在 Python 中是否有效?

PS:用例可能是创建 100,000 个单键 Derivatives,其中键是一个变量(不是字符串,因此没有关键字初始化)。这其实并不慢,所以这里的“效率原因”更像是“优雅”的意思:理想情况下不需要在不需要副本的时候浪费时间去做副本。因此,在这种特殊情况下,问题更多的是 Python 可以带来的优雅/清晰度,而不是运行速度。

最佳答案

通过继承dict为构造函数参数提供了三种可能性:(除去 {} 文字)

class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)

这意味着,为了实例化您的实例,您必须执行以下操作之一:

  1. 将变量作为关键字 D(x=1) 传递,然后将其打包到中间字典中。
  2. 创建普通字典并将其作为映射传递。

  3. 传递一个可迭代的(键,值)对。

因此,在所有这三种情况下,您都需要创建中间对象来满足 dict 构造函数的要求。

单个对的第三个选项看起来像 D(((var,1),)),出于可读性考虑,我强烈建议不要这样做。

因此,如果您希望您的类继承自字典,使用 Derivatives({var: 1}) 是最有效和最易读的选择。

作为个人注意事项,如果您将拥有数千个单对词典,我不确定 dict 设置首先是如何最好的,您可能只是重新考虑您的类(class)的基础。

关于python - 自定义类是一个 dict,但没有 dict 副本初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38937227/

相关文章:

python - 抓取 MTA 地铁数据?

python - 如何测试从某个抽象类继承的对象类

python 映射与字符串

c++ - 使用 C++ 继承的不可访问项

python - 三次样条插值仅产生 nans 或引发错误

python - Windows7 本地主机上的 Selenium Remote Webdriver 抛出空指针异常

android - 为什么Android org.json.* 没有实现Map 接口(interface)?

.net - 是否有一个像没有值的字典一样工作的集合?

c++ - 尝试在 Qt 中继承 QLCDNumber 的问题

python - Python中的描述符类设计(带继承)