在Python3中重写uuu repr uuuu()?

2024-06-26 13:56:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过简单地调用对象本身来解决如何让python对象返回默认值的问题。基本上,这相当于其他语言通用的类“default member”(我记得在VB时代就使用过它)。你知道吗

例如,假设我创建了一个扩展基本Python元组的SuperTuple()类。如果我不带参数调用对象,我希望它返回Python元组,而不是字符串表示(如__repr__())。你知道吗

如果我的基础课看起来像:

class SuperTuple():

    _tuple = ()

    def __init__(self, tuple):
        _tuple = tuple

我想要以下行为:

>>> a = SuperTuple((1,2,3))
>>> a._tuple
(1, 2, 3)
>>> a
(1, 2, 3)

我怀疑在Python中,没有一种方法可以不随意创建一些需要显式调用的“default”类成员,这在某种程度上违背了这个目的。你知道吗

当然,它的优点是能够在其他操作中使用它,而不必处理操作符过载和其他相关问题:

>>> a = Supertuple(1, 2, 3)
>>> b = a + (4, 5, 6)
>>> b
(1, 2, 3, 4, 5, 6)
>>> type(a)
<class 'SuperTuple'>
>>> type(b)
<class 'tuple'>

Tags: 对象字符串语言default参数typeclassmember
2条回答

您只需从tuple继承即可,它保留了所有所需的行为。如果您想添加一个属性,就不能在__init__中添加,因为实例已经存在,并且是不可变的!因此,您必须重写__new__,它实际上创建了实例:

class Supertuple(tuple):
    def __new__(cls, arg):
        self = super(Supertuple, cls).__new__(cls, arg)
        self._tuple = tuple(arg)
        return self

>>> s = Supertuple([1,2,3])
>>> s._tuple
(1, 2, 3)
>>> s
(1, 2, 3)

Python没有像VB或其他语言那样的“default属性”。你知道吗

看起来您想使SuperTuple成为tuple的后代,这样对象本身就是tuple的扩展:

class SuperTuple(tuple):
    pass

它将继承元组的所有行为,包括以默认值启动元组:

>>> t = SuperTuple((1, 2, 3))
>>> t
(1, 2, 3)
>>> type(t)
__main__.SuperTuple

编辑:您可以覆盖其他魔术方法以包含所需的行为,例如:

class SuperTuple(tuple):

    def __add__(self, other):
        return SuperTuple(tuple(self) + other)

>>> t = SuperTuple((1, 2, 3))
>>> t2 = t + (4, 5, 6)
>>> t2
(1, 2, 3, 4, 5, 6)
>>> type(t2)
__main__.SuperTuple

相关问题 更多 >