在Python 2.5中覆盖反转(...)

时间:2010-10-16 14:02:09

标签: python python-2.5

我需要为我在App Engine上部署的类定制__reverse__函数,因此需要使用Python 2.5。是否有__future__导入或我可以使用的解决方法?

子类化list不起作用,因为我需要将我的类作为dict的子类。

修改

使用OrderedDict无法解决问题,因为dict密钥与list项不同。

这是我要创建的对象:

  1. 我的对象需要提供与list相同的属性,即支持iter(obj)reverse(obj)

  2. 元素必须是特殊第三方类的实例。

  3. 每个元素都与一个键相关联。

  4. 在内部,需要使用其键访问这些对象。这就是我将它们放在映射中的原因。

  5. 我已将我的实现修改为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的子类,我的问题就解决了。

2 个答案:

答案 0 :(得分:2)

2.5中不支持

__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>