我已经实现了一个自定义列表,其中包含许多可用的魔术方法(__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
,但之后我无法访问列表方法。
答案 0 :(得分:1)
没有;赋值variable = new_list
不是列表的行为,它尤其不是之前变量中任何值的行为。它将忘记变量之前引用的内容,并在其中添加新的引用。
如果您有一个实例变量,就像您的情况一样,赋值由变量所在的对象控制,因此您可以重新定义它;但它再次与之前所包含的价值无关。