我有一个现有的列表实例,它在实时代码中包含引用。当列表引用传递给某个函数时,我需要确保该列表中的所有项目从那时起都是有效的(验证所有列表项,然后附加验证以备将来的更改)。
创建一个覆盖__setitem__
和朋友的新类,同时从列表派生,提供所需的验证(PropertyList如下所示)。问题是代码的其他部分指向旧的列表引用,因为这是库的一部分,我不能真的要求开发人员考虑到这一点(它打破了向后兼容性并且会以这样的方式咀嚼代码一开始并不明显。)
无论如何我可以更改列表项的“实时”类,以便对列表的所有引用现在都会调用修改后的__setitem__
等方法吗?
class PropertyList(list):
def __init__(self, validator, *args, **kwargs):
self.__validator = validator
super(PropertyList, self).__init__(*args, **kwargs)
def __setitem__(self, key, value):
value = self.__validator(value)
super(PropertyList, self).__setitem__(key, value)
def append(self, value):
value = self.__validator(value)
super(PropertyList, self).append(value)
def extend(self, other):
other = map(self.__validator, other)
super(PropertyList, self).extend(other)
def insert(self, index, value):
value = self.__validator(value)
super(PropertyList, self).insert(index, value)
答案 0 :(得分:1)
不,没有。即使您可以替换__class__
属性,也不应该尝试这样做,这会让人感到困惑并且可能会以微妙的方式破解。如果您需要创建验证列表,则需要创建一个新对象并使用该对象而不是旧对象。