调用super()。__str__似乎在列表子类中调用self .__ repr __

时间:2018-11-05 14:43:51

标签: python python-3.x class super subclassing

我发现了类似的问题,但是它们已经很老了(6-8岁),并且可能已经过时了,顺便说一句,有些答复缺乏解释。

我编写了以下python-3代码段,以使该类支持存储名称和未命名字段,就像您可以在函数调用中使用具有名称和变量的变量一样:

class struct(list):
    def __init__(self, *args, **kwargs):
        super().__init__(args)
        for key, value in kwargs.items():
            setattr(self, key, value)

    def __repr__(self):
        s = super().__repr__()[1:-1]
        for key, val in self.__dict__.items():
            s += ', '+key+'='+repr(val)
        return 'struct('+s+')'

    def __str__(self):
        s = super().__str__()[1:-1]
        print('Debug : super().__str__() = "'+super().__str__()+'"')
        print('Debug : list(self).__str__() = "'+list(self).__str__()+'"')
        print('Debug : s = "'+s+'"')
        for key, val in self.__dict__.items():
            s += ', '+key+'='+str(val)
        return '{'+s+'}'

a = struct(1, 2, 3, a="akeja", b=21, c=True, d="lkj")
print('repr(a)="'+repr(a)+'"\n')
print('str(a)="'+str(a)+'"\n')

在idle-3.5.2中执行此代码将产生以下结果:

>>> 
 RESTART: struct.py 
repr(a)="struct(1, 2, 3, b=21, d='lkj', a='akeja', c=True)"

Debug : super().__str__() = "struct(1, 2, 3, b=21, d='lkj', a='akeja', c=True)"
Debug : list(self).__str__() = "[1, 2, 3]"
Debug : s = "truct(1, 2, 3, b=21, d='lkj', a='akeja', c=True"
str(a)="{truct(1, 2, 3, b=21, d='lkj', a='akeja', c=True, b=21, d=lkj, a=akeja, c=True}"

>>> 

this post中,@ Sven Marnach强调了在list.__init__(self, args)方法中使用super().__init__(args)而不是__init__(...)的必要,但这并没有任何改变(实际上,他写道list.__init__(self, *args),但那根本不起作用。

但是,正如在第二行调试中看到的那样,对super().__str__()的调用,我希望返回对我的超类({{1} }),实际上会返回非常类似于__str__

的预期收益的内容

我不知道为什么似乎list而不是self.__repr__()被调用。我应该像在@Sven Marnach 6y.o中一样直接从self.__repr__()呼叫list(self).__str__()吗?建议?那是正确的方法吗?为什么呢还是这只是我应该报告的错误?

0 个答案:

没有答案