【问题标题】:What's the purpose of "class MyDict(dict): pass", how is it different from a regular dictionary?“class MyDict(dict): pass”的目的是什么,它与普通字典有什么不同?
【发布时间】:2018-10-25 10:03:19
【问题描述】:

MyDict 类有什么用,content 属性有什么用?

class MyDict(dict):
       pass

company_settings_dict = instance.as_company_console_settings()
message = MyDict()
notification_type = "CompanyConsoleSettings"
data = {"data": company_settings_dict, "notification_type": "%s" % (notification_type), "is_new": False}
message.content = {"message": "%s" % (json.dumps(data)), "room": instance.company.id}

【问题讨论】:

  • 可能只是一个占位符,用于向基本字典类型添加更多代码。所有功能显然都来自基类,即dict
  • @hspandher 你可以在MyDict的实例上随意设置属性。
  • @timgeb 是的,你可以,但是在类实例上这样做似乎不是很优雅,不是吗?
  • @hspandher 不知道,可能很大程度上取决于上下文。

标签: python django dictionary


【解决方案1】:

在最后一行,您分配给message.content

这对于内置的dict 是不可能的。

>>> d = {}
>>> d.content = 1
[...]
AttributeError: 'dict' object has no attribute 'content'

事实上,字典甚至没有__dict__(显然)。

>>> vars(d)
[...]
TypeError: vars() argument must have __dict__ attribute

但是,您的自定义类型不会出现此类问题。

>>> class MyDict(dict):
...:    pass
...:
>>> d = MyDict()
>>> d.content = 0
>>> vars(d)
>>> {'content': 0}

如果您打算设计一个更复杂的dict 子类,请从collections.UserDict 继承。我已经在this答案的最后部分列出了直接从dict继承的一些问题。

【讨论】:

  • 每个继承的类都这样吗?
  • @AmrishMishra 是的,写为MyClass(AnotherClass): pass 的用户会将__dict__ 添加到MyClass 的实例中(即使AnotherClass 定义了__slots__)。
  • 非常感谢
猜你喜欢
  • 2016-05-12
  • 2021-05-21
  • 2017-08-10
  • 2020-09-10
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多