代码之家  ›  专栏  ›  技术社区  ›  Attila O.

在Python2.5中重写反转(…)

  •  0
  • Attila O.  · 技术社区  · 14 年前

    我需要一个习惯 __reverse__ 我在App Engine上部署的类的函数,因此它需要使用 Python 2.5 __future__ 导入还是我可以使用的解决方法?

    子类别化 list 不起作用,因为我需要我的类是 dict .

    :

    使用 OrderedDict 不会解决问题,因为 钥匙和 项目。

    这是我要创建的对象:

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

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

    3. 在内部,需要使用它们的键访问这些对象。所以我把它们放在地图上。

    列表 子类而不是 迪克特

    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:

    现在我的类是 ,我的问题解决了。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Ned Batchelder    14 年前

    __reversed__ 在2.5中不受支持,因此如果确实需要自定义集合的相反顺序,唯一的选择是修改调用的位置 reversed 用别的东西。

    但我很好奇:如果你是 dict

        2
  •  1
  •   poke    14 年前

    创建自定义 __reversed__ 只有在2.6之后才有可能,所以不能简单地实现它 reversed 颠倒的 通过实现序列协议(即 __len__ __getitem__ ).

    另一种可能是替换内置函数 使用一个以不同方式处理自定义类的自定义函数。这可以像这样工作:

    originalReversed = reversed
    def myReversed ( seq ):
        if isinstance( seq, MyCustomClass ):
            # do something special
        else:
            return originalReversed( seq )
    reversed = myReversed
    

    但是,我不建议这样做,因为它会改变内置函数的正常行为(显然),并且可能会混淆其他用户。。所以你应该执行sequnce协议 颠倒的