Атрибут Dataclass отсутствует при использовании явного конструктора __init__ и параметра default_factory в dataclasses.fPython

Программы на Python
Anonymous
Атрибут Dataclass отсутствует при использовании явного конструктора __init__ и параметра default_factory в dataclasses.f

Сообщение Anonymous »

Следующий код создает класс данных Obj с полем int n со значением по умолчанию 0.

Код: Выделить всё

from dataclasses import dataclass, field

@dataclass
class Obj:
n: int = field(default_factory=int)

a = Obj()
print(a.n)

Код: Выделить всё

a.n = 0
Теперь добавьте явный конструктор __init__:

Код: Выделить всё

@dataclass
class Obj:
n: int = field(default_factory=int)

def __init__(self): # explicit constructor
pass
Теперь генерируется ошибка, утверждающая, что объект Obj не имеет атрибута с именем n:

Код: Выделить всё

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [6], in 
8         pass
10 a = Obj()
---> 11 print(f'a.n = {a.n}')

AttributeError: 'Obj' object has no attribute 'n'
Я думал, что явный __init__ переопределит все, что делает field(), но если мы изменим параметр default_factory на default, он снова заработает:

Код: Выделить всё

@dataclass
class Obj:
n: int = field(default=3)

def __init__(self):
pass

Код: Выделить всё

a.n = 3
Такое поведение наблюдается как в Python 3.8, так и в 3.10.

Вернуться в «Python»