示例1:继承内置数据类型(字典(
Class example_class(dict):
def __init__(self):
dict.__init__(self)
self["key1"] = "value1"
self["key2"] = "value2"
self.random_variable = 15
示例2:没有字典继承(但得到相同的"结果"(
Class example2_class:
def __init__(self):
self.example_dictionary = dict() # or alternatively {}
self.example_dictionary["key1"] = "value1"
self.example_dictionary["key2"] = "value2"
self.random_variable = 29
有人能解释示例1和示例2之间的区别吗;2,喜欢优点/缺点
通过从内置类型字典继承,您可以覆盖(一些(内置方法,但是我看到了从这些内置数据类型继承的代码,而没有重新定义任何现有方法,在这种情况下,我不明白为什么您会尝试继承内置数据类型,而不是只在init((方法中创建一个对象。
模糊的答案是,如果您想定义一个具有该类型行为的类,那么继承内置类型是有用的。除非你实现了一堆遵循self.example_dictionary
的神奇方法,否则你的example2
不会像dict
那样工作;您的example1
会自动执行dict
所能执行的所有操作,因为它是dict
。
collections
有一些很好的继承dict
的类型的具体例子:defaultdict
和Counter
。如果你同时实现这些类,不管有没有子类化,你会发现子类化的实现要简单得多——此外,子类化意味着如果你使用静态类型检查,defaultdict
(是dict
的一种类型(在dict
所在的任何地方都会被自动接受,这是期望的质量(因为它实际上是CCD_ 14并且做CCD_。
一般来说,第二种方法不允许您使用所有dict
魔术。
e_dict = example_class()
# all of this works
print(e1["key1"])
print(len(e1))
e1.update({"a": "b"})
print(e1) # it has nice representation
print("key1" in e1)
还有更多
当然,你可以实现所有需要的方法,但如果你需要一些dict魔术,从dict继承就更容易了
还有更多的选项,比如MutableMapping或UserDict,你可以在这里阅读更多关于它的信息