我发现了类似的问题,但是它们已经很老了(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__()
吗?建议?那是正确的方法吗?为什么呢还是这只是我应该报告的错误?