我正在使用Python3.7中支持的Python3.7模块。我偶然发现了这样的行为: dataclass子类不继承__repr__。
from dataclasses import dataclass
@dataclass
class Person:
name: str
def __repr__(self):
return f'{self.__class__.__qualname__}({self.name})'
def print_something(self):
return self.name
@dataclass
class Employee(Person):
title: str这是输出
In [21]: e = Employee(name='Dmitry', title='Systems Engineer')
In [22]: p = Person(name='Dmitry')
In [23]: repr(e)
Out[23]: "Employee(name='Dmitry', title='Systems Engineer')"
In [24]: p = Person(name='Dmitry')
In [25]: repr(p)
Out[25]: 'Person(Dmitry)'
In [26]: p.print_something()
Out[26]: 'Dmitry'
In [27]: e = Employee(name='Dmitry', title='Systems Engineer')
In [28]: repr(e)
Out[28]: "Employee(name='Dmitry', title='Systems Engineer')"
In [29]: e.print_something()
Out[29]: 'Dmitry'( 1)为何会出现这种情况?
2)这种行为有解决办法(除了在子类中重新定义__repr__之外)?
发布于 2018-10-31 19:51:07
之所以会发生这种情况,是因为dataclass自动添加了一个__repr__方法,这个方法恰好恰好是基类中的方法,所以您没有注意到。传递repr=False for dataclass以不添加repr:
In [5]: from dataclasses import dataclass
...:
...: @dataclass(repr=False)
...: class Person:
...: name: str
...:
...: def __repr__(self):
...: return f'{self.__class__.__qualname__}({self.name})'
...:
...: def print_something(self):
...: return self.name
...:
...: @dataclass(repr=False)
...: class Employee(Person):
...: title: str
...:
In [6]: Person('foo')
Out[6]: Person(foo)
In [7]: Employee('foo', 'bar')
Out[7]: Employee(foo)https://stackoverflow.com/questions/53090915
复制相似问题