我试图从数据类调用超类方法slots=True
在 Python 3.10.5 中。
from dataclasses import dataclass
@dataclass(slots=True)
class Base:
def hi(self):
print("Hi")
@dataclass(slots=True)
class Sub(Base):
def hi(self):
super().hi()
Sub().hi()
我收到以下错误。
Traceback (most recent call last):
File "...", line 16, in <module>
Sub().hi()
File "...", line 13, in hi
super().hi()
TypeError: super(type, obj): obj must be an instance or subtype of type
如果我删除它就可以正常工作slots=True
from Sub
,或者将其设为非数据类__slots__
手动。如果我改为执行这些操作,错误仍然存在Base
.
Sub.__mro__
is (<class '__main__.Sub'>, <class '__main__.Base'>, <class 'object'>)
and isinstance(Sub(), Base)
is True
.
As seen here,数据类装饰器创建一个新的类对象,所以__closure__
附于hi()
与附加到装饰类的不同,因此super()
由于依赖于__closure__
.
因此,你需要改变super().hi()
to super(Sub, self).hi()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)