是否可以在Python中覆盖赋值('=')运算符?

发布于 2021-01-29 17:32:46

为此有麻烦吗?也许类似于以下内容:(更新)

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设置为项目或树。所以我想重载在该项目上使用=运算符时调用的函数。

PyQt具有基于项目的体系结构,其中QAbstractItemModel被覆盖。(我猜)这应该返回/接受QModelIndex对象。这些是表树(2D数组)。

因此,我正在创建一个单一的树结构,该树结构可以包含自身,处理两个相反的索引范例,并且可以与Python和其他所有东西一起很好地使用。

关注者
0
被浏览
151
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    无法覆盖的实现x = y。有关赋值含义的详细信息,请参见关于Python名称和值的事实和神话

    您可以x.a = y使用__setattr__(大约)来覆盖它x.__setattr__('a', y)

    您可以覆盖x[k] = y__setitem__,它是(大约)x.__setitem__(k, y)

    但是您不能覆盖x = y



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看