【发布时间】:2021-09-30 18:51:22
【问题描述】:
我想构建一个类的子类,它基本上是一个列表/字典的包装器,我想使用这个类的实例作为键。为了方便访问列表/字典方法,我想我可以只对它们进行子类化,但后来我失去了哈希性。
我知道这与可变类的__eq__ 不兼容(我不需要它),所以我想出了以下解决方案。
class Foo(list):
__hash__ = object.__hash__
__eq__ = object.__eq__
虽然我怀疑这会出现在我的特定应用程序中,但我想如果另一个类(具有自己的 __hash__)会出现在子类的 MRO 中的 Foo 和 list 之间,这可能会导致问题。
- 有没有更 Pythonic 的方式来做到这一点?我可以只添加一个列表/字典作为属性,然后简单地使用该属性(这会使其他地方的代码更麻烦)或我需要的列表/字典方法(但如果我需要的不止一对,那就更麻烦了方法)。
- 是否有一些模式/配方可以让我在合作环境中做这种事情(换句话说,如果我确实预期
Foo和list之间的另一个类,我应该如何更改代码在 MRO 中)?
【问题讨论】:
-
相反,我将包装 dict 类,并覆盖 set / get 函数以获取列表并以预定义的方式处理它们
-
@FloLie:是的,我想过这个问题,但是如果我想拥有更多方法,似乎需要编写很多代码,而且我可能会,比如
__iter__、__len__等 -
如果你实现
__getattr__,你可以非常简单地编写包装类(使用组合) -
@juanpa.arrivillaga:你有什么想法?我可以看到
__getitem__+__setitem__可以如何使用(但是您仍然有很多其他方法...),但是__getattr__将如何帮助?
标签: python inheritance design-patterns subclass