我需要为我在App Engine上部署的类定制__reverse__
函数,因此需要使用Python 2.5
。是否有__future__
导入或我可以使用的解决方法?
子类化list
不起作用,因为我需要将我的类作为dict
的子类。
修改:
使用OrderedDict
无法解决问题,因为dict
密钥与list
项不同。
这是我要创建的对象:
我的对象需要提供与list
相同的属性,即支持iter(obj)
和reverse(obj)
。
元素必须是特殊第三方类的实例。
每个元素都与一个键相关联。
在内部,需要使用其键访问这些对象。这就是我将它们放在映射中的原因。
我已将我的实现修改为list
子类而不是dict
子类,所以这就是我现在所拥有的:
class Foo(list):
pat = {}
def __init__(self):
for app in APPS: # these are strings
obj = SpecialClass(app)
self.append(obj)
self.pat[app] = obj
def __getitem__(self, item):
# Use object as a list
if isinstance(item, int):
return super(Foo, self).__getitem__(item)
# Use object as a dict
if item not in self.pat:
# Never raise a KeyError
self.pat[item] = SpecialClass(None)
return self.pat[item]
def __setitem__(self, item, value):
if isinstance(item, int):
return self.pat.__setitem__(item, value)
return super(Foo).__setitem__(item, value)
编辑2:
既然我的班级是list
的子类,我的问题就解决了。
答案 0 :(得分:2)
__reversed__
,因此如果您真的需要自定义收集的颠倒顺序,则唯一的选择是修改您调用reversed
的地方以使用其他内容。
但我很好奇:如果你是dict
的子类,那么项目的顺序无论如何都是任意的,那么在这种情况下反转意味着什么呢?
答案 1 :(得分:1)
仅在2.6之后才能创建自定义__reversed__
,因此您不能简单地实现它,并使reversed
在2.5中工作。但是,在2.5及以下版本中,您可以通过实施序列协议(即同时实现reversed
和__len__
)使自定义类仍与__getitem__
一起使用。
另一种可能性是将内置函数reversed
替换为以不同方式处理自定义类的自定义函数。这可以这样工作:
originalReversed = reversed
def myReversed ( seq ):
if isinstance( seq, MyCustomClass ):
# do something special
else:
return originalReversed( seq )
reversed = myReversed
但是,我不建议这样做,因为它改变了内置函数的正常行为(显然)并且可能会混淆其他用户。所以你应该实现sequnce协议以使reversed
工作。< / p>