在Python中,是否可能重载赋值('=')运算符?

17

这个有相应的特殊名称吗?也许可以类比以下内容:(已更新)

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的Model-View-Delegate架构无缝集成。

我希望能够将传入的item_or_tree设置为item或tree。因此,我要重载在item上使用等号(=)操作符时调用的函数。

PyQt有这种基于项目的架构,在其中覆盖了QAbstractItemModel。这应该返回/接受QModelIndex对象。这些是表格(2D数组)的树。

因此,我正在创建一个可以包含它自身、处理两种对立的索引范例并与Python和其他所有内容兼容的单一树形结构。


3
我认为这会违反Python的对象模型或变量/命名方案。一个名称并不仅代表一个对象,而只是在幕后指向一个对象。使用赋值运算符只会改变名称所指向的对象。 - SethMMorton
因为一旦将其分配给变量,就无法再使用该标签进行任何操作了。 - Inversus
12
Python 的工作方式与此完全不同。赋值操作甚至不会“触及”对象,它仅仅是对名称进行操作。你应该描述你试图解决的问题,以便我们可以专注于如何实现它。 - user395760
@delnan 是的,这正是我担心的。我所尝试做的是实现一个通用的树形对象,以便能够轻松地在我的代码和PyQt5的模型视图架构中使用。我会在问题中详细说明,稍等。 - Inversus
1
属性的分配/设置(针对给定的对象)可以被拦截……不确定这是否有用,或者在此情况下值得探索。参考:http://intermediate-and-advanced-software-carpentry.readthedocs.org/en/latest/new-style-classes.html - user2864740
1个回答

32

无法重写x = y的实现。有关分配含义的详细信息,请参见有关Python名称和值的事实和神话

您可以使用__setattr__重写x.a = y,它(大致上)是x.__setattr__('a', y)

您可以使用__setitem__重写x[k] = y,它(大致上)是x.__setitem__(k, y)

但是您无法重写x = y


3
很难过,但可以理解。谢谢。 - Inversus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接