继承 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
类型的具体示例:defaultdict
和Counter
。如果您要在有子类和没有子类的情况下实现这些类,您会发现子类的实现要简单得多——此外,子类化意味着如果您使用静态类型检查,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 内置数据类型与创建新对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章