Можно ли переопределить оператор присваивания ('=') в Python?

есть ли dunder для этого? Возможно, что-то вроде: (обновлено)

class Tree:
    def __init__(self, item_or_tree):
        self._setto(item_or_tree)

    def __assign__(self, val):
        self._setto(item_or_tree)

    def __setitem__(self, which, to_what):
        ## I would like this to call __assign__ on the Tree object at _tree[which]
        to_what._tree[which] = to_what

    def __getitem__(self, which):
        return self._tree[which]

    def __len__(self): return len(self._tree)

    def __eq__(self, other):
        if isinstance(other, Tree):
            if other._is_tree:
                return (self._item == other._item) and (self._tree == other._tree)
            else:
                return self._item == other._item
        else: return self._item == other

    def _setto(self, item_or_tree):
        if isinstance(item_or_tree, Tree):
            self._set_from_Tree(item_or_tree)
        elif isinstance(item_or_tree, dict):
            self._set_from_dict(item_or_tree)
        else:
            self._set_from_other(item_or_type)


    def _set_from_Tree(self, other_Tree):
        self._tree = other_Tree[:]
        self._item = other_Tree
        self._is_tree = other_Tree._is_tree

    def _set_from_dict(self, the_dict):
        self._is_tree = True
        self._item = None
        self._tree = {}
        for key, val in the_dict.items():
            self._tree[key] = Tree(val)

    def _set_from_other(self, other):
        self._is_tree = False
        self._tree = None
        self._item = other

class TreeModel(Tree, QAbstractItemModel):
    ...
    ## a whole bunch of required overrides
    ## etc
    ...

то, что я пытаюсь сделать,-это реализовать обобщенную древовидную структуру, которая действует интуитивно (для меня), насколько это возможно, а также легко интегрируется с архитектурой делегата модели PyQt5.

Я хочу иметь возможность установить входящий item_or_tree либо в элемент, либо в дерево. Поэтому я хочу перегрузить функцию, которая вызывается, когда оператор = используется на пункт.

PyQt имеет архитектуру на основе этого элемента, в которой переопределяется QAbstractItemModel. Это (я думаю) должно возвращать / принимать объекты QModelIndex. Это деревья таблиц (2D массивы).

поэтому я создаю единую древовидную структуру, которая может содержать себя, иметь дело с 2 противоположными парадигмами индексирования и хорошо играть с Python и всем остальным.

1 ответов


невозможно переопределить реализацию x = y. См.факты и мифы об именах и значениях Python для получения подробной информации о том, что означает назначение.

можно переопределить x.a = y С __setattr__, это (грубо) x.__setattr__('a', y).

можно переопределить x[k] = y С __setitem__, это (грубо) x.__setitem__(k, y).

но вы не можете переопределить x = y.