继承 python 内置数据类型与创建新对象? [复制]

Posted

技术标签:

【中文标题】继承 python 内置数据类型与创建新对象? [复制]【英文标题】:Inheriting python build-in data types vs creating a new object? [duplicate] 【发布时间】:2022-01-23 20:23:54 【问题描述】:

示例 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 之间的区别,例如优点/缺点?

通过从内置类型字典继承,您可以覆盖(一些)内置方法,但是我看到了从这些内置数据类型继承的代码,而无需重新定义任何现有方法,在这种情况下我没有不明白为什么你会尝试继承内置数据类型,而不是仅仅在 init() 方法中创建一个对象。

【问题讨论】:

是的,只有知道“作曲”这个词才能找到正确的答案。我还用副本向您指出了这一点。您的“更有用”的答案都不能帮助您使用真正需要研究的术语。如果您愿意,我可以撤消欺骗关闭,但是您的问题太宽泛了。以及“我应该使用组合还是继承?”的根本问题。在没有非常具体的用例的情况下,主要是固执己见。 @AndrasDeak:有没有这样的事情,比如打开一个问题 24 小时然后再次关闭?只是想知道其他人是否有任何新见解,但本质上这个问题确实与提出的问题相似。无论如何,来自欧洲的爱 @AndrasDeak 有更好的标题吗?您可以将其关闭,是的,这主要是一个固执己见的问题。在我看来,链接的问题只有 3 个主要问题:1)缺乏示例,这导致了一些一般性的答案(示例总是很清楚),例如它对初学者特别友好(它有点是初学者的问题)。 2) 2010 年之后没有人愿意回答,这是一种耻辱,一些新功能/更改可能会偏向于另一个(=> 过时的信息)。 3) 我对内置数据类型(例如列表、字典……)特别感兴趣 【参考方案1】:

模糊的答案是,如果您想定义一个具有该类型的大量行为的类,那么继承一个内置类型很有用。你的example2 不会像dict 那样表现,除非你实现了一堆遵循self.example_dictionary 的魔法方法;你的 example1 自动完成 dict 可以做的所有事情,因为它 dict

collections 有一些很好的继承dict 类型的具体示例:defaultdictCounter。如果您要在有子类和没有子类的情况下实现这些类,您会发现子类的实现要简单得多——此外,子类化意味着如果您使用静态类型检查,defaultdict(是 @ 987654332@) 在dict 所在的任何地方都会自动被接受,这是一种理想的品质(因为它实际上是dict 并且可以做dict 可以做的所有事情)。

【讨论】:

【参考方案2】:

通常第二种方法不会让您使用所有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)

还有much more

当然你可以实现所有需要的方法,但是如果你需要一些 dict 魔法,那么从 dict 继承会更容易

还有更多选项,如MutableMapping或UserDict,您可以阅读更多相关信息here

【讨论】:

以上是关于继承 python 内置数据类型与创建新对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

引用类型

1.3.1 变量与内置数据类型

python 内置数据类型与方法

补8.python之面相对象part.6(补充授权与继承的概念)

鸭子类型

面向对象-鸭子类型