在自定义列表中实现__set__

时间:2015-10-19 01:05:05

标签: python list

我已经实现了一个自定义列表,其中包含许多可用的魔术方法(__setitem____getitem____iter____add____iadd__,... )。

我想知道是否有办法实现赋值运算符(当我执行my_object.my_list=[some other list]时调用)。

我一直在考虑描述符,但我必须在其他方法中获取属性所在的实例(示例中为my_object),因此我无法将其定义为静态和使用getattr

我有以下内容:

class List (object):
    def __init__ (self, instance):
        self._instance = instance
        self._items = []
        ...
    def __getattr__ (self, index):
        something using self._instance
        ...
    def __setattr__ (self, index, value):
        something more using self._instance even more
        ...
    ...
class ListCreator (object):
    def __init__ (self):
        ...
    def setup (self, instance, name):
        l = List(instance)
        setattr(instance,name,l)
class A (object):
    x = ListCreator()
    def __init__ (self):
        for key,value in self.__class__.__dict__:
            if isinstance(value,ListCreator):
                value.setup(self,key)

问题是我想以a.x的形式访问列表,其中a是A的实例,但我希望它的行为类似于列表,并实现其他方法。但是,如果我将ListCreator实例定义为描述符并抛出List,则无法访问这些方法中的a实例。

哪种方式最适合做这样的事情?我已尝试继续使用List并在__set__课程中实施ListCreator,但之后我无法访问列表方法。

1 个答案:

答案 0 :(得分:1)

没有;赋值variable = new_list不是列表的行为,它尤其不是之前变量中任何值的行为。它将忘记变量之前引用的内容,并在其中添加新的引用。

如果您有一个实例变量,就像您的情况一样,赋值由变量所在的对象控制,因此您可以重新定义它;但它再次与之前所包含的价值无关。