【发布时间】:2015-06-27 09:22:05
【问题描述】:
假设我想要一个带有 2 个元素的自定义 frozenset,它可以迭代、散列、比较,并具有其他各种不错的操作作为冻结集,但打印方式不同。
>>> p = edge(5, 7)
>>> p == edge(7, 5)
True
>>> p
edge(5, 7)
我可以继承,也可以委托,但在这两种情况下我都可以得到我想要的。
如果我从字面上继承,我似乎无法写__init__,因为我的父母是不可变的。我可以只写:
class edge:
def __new__(cls, a, b):
return frozenset({a, b})
但是我得到了一个合适的frozenset并且无法自定义它的__repr__,这就是我想要做的。我不能让super() 以任何好的方式在这里工作。
如果我委托,我可以覆盖 __getattr__ 或 __getattribute__,但在寻找 __iter__ 时,它们都不起作用。我想特殊方法在这里太特殊了。我目前唯一的解决方案是手动委托我能想到的每个特殊方法,但肯定有更好的方法。有什么想法吗?
【问题讨论】:
-
我不清楚你想做什么。您是只想更改
__repr__,还是也想更改__init__?因为如果您只想更改__repr__,则不需要覆盖__init__。 -
更改
__repr__是首要任务。但我想,在编写新类时,不妨更改新边的构造以删除不必要的 {}。
标签: python immutability delegation