Как и в предыдущем вопросе: TypeError: объект 'int' не является итерируемым, пока не существует итерации?, я обнаружил проблему в своей программе. Это: В Питоне,
set( (0,0) ) на самом деле дает вам {0}, но я хочу {(0,0)}collections.deque( ((0, 0), [ (0, 0) ] ) ).popleft() на самом деле дает вам (0,0) , а я хочу ((0, 0), [ (0, 0) ] )Итак, теперь я думаю о разработке собственных классов данных. Тем не менее, в тестовом коде я столкнулся с тем, что объект «функция» не имеет проблемы с атрибутом «МРО».
Код теста 1:
from dataclasses import dataclass
@dataclass
def DequeItems():
current:tuple
path:list
a=DequeItems(current=(0, 0),\
path=[ (0, 0) ] )
print(a)
Скриншот ошибки тестового кода 1:
Тестовый код 2:
from dataclasses import dataclass
@dataclass(init=True)
def Pair():
visit:tuple
a=Pair( visit=(0,0))
print(a)
Скриншот ошибки тестового кода 2:

Моя версия Python — Anaconda 3.6.8.
Насколько я понимаю, этот декоратор позаботится о многих методах, таких как __init__, __eq__, для вас @ForceBru
Да, ты прав. У функции обычно есть эти методы? Имеет ли смысл иметь их для функции?
Напишите set(((0,0),)), чтобы получить набор кортежей
@ForceBru Конечно, обычно вам не нужны эти сложные вещи. Но в моем случае мне нужен класс для хранения вещей.
@JiapengZhang, да, вам нужен класс, но DequeItems и Pair — это функции!
@ForceBru О. Я этого не понимал! Спасибо.






Аргумент set должен быть итерируемым, элементы которого являются желаемыми элементами набора. set( (0,0) ) имеет итерируемый объект в качестве аргумента, но его элементами являются 0 и 0, а не кортеж (0,0). Вам нужен set([(0,0)]). То же самое касается deque; вам нужен итерируемый содержащий кортеж ((0, 0), [ (0, 0) ] ), поэтому
collections.deque([((0, 0), [ (0, 0) ] )])
Что касается ошибки, которую вы видите, function не имеет __mro__, потому что он ему не нужен. Его базовым классом всегда является object, и вы не можете наследовать от function, чтобы создать класс, чей MRO должен будет получить доступ к гипотетическому MRO function.
Что касается Зачем, ваш класс данных вызывает эту ошибку, потому что декоратор dataclass должен декорировать класс, а не функцию.
from dataclasses import dataclass
@dataclass
class DequeItems:
current:tuple
path:list
a = DequeItems(
current=(0, 0),
path=[(0, 0)]
)
print(a)
Согласно документы, этот модуль «предоставляет декоратор и функции для автоматического добавления сгенерированных специальных методов <..> в определяемый пользователем классы». Является ли что-то, начинающееся с
def, классом?