【问题标题】:Customizing immutable types in Python [duplicate]在 Python 中自定义不可变类型
【发布时间】: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


【解决方案1】:

我太傻了。现在可以了。如果有人想知道怎么做,这里是:

class pair(frozenset):
    def __new__(cls, a, b):
        return super().__new__(cls, {a, b})
    def __repr__(self):
        a, b = sorted(self)
        return "{} & {}".format(a, b)

错误是我打电话给super().__new__({a, b}) 认为它会像self 一样变形我的cls,当不带参数调用时。当然,__new__ 是隐含的 classmethod 并没有帮助。 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2017-09-18
    相关资源
    最近更新 更多