用自定义替换Python List / Set实现

时间:2014-04-15 20:27:17

标签: python list metaclass

我目前正在使用由我的教授开发的Python语言编写源到源编译器。一切顺利,但是一些语言特质让我很生气。源语言有1个索引列表和不同的切片规则,Python使用(更加理智)0索引列表。

有没有办法可以替换Python使用的列表实现?以下给出了我想要的想法。

class MyList(list):
    # My implementation of 1-indexed lists
    pass

x = ["foo", "bar", "baz"] 
y = MyList(["foo", "bar", "baz"])

assert type(x) == type(y) # Should work
assert x[1] == "foo" # Should work

我想使用语法gly python给我一个列表,而不是处理我自己生成它。我知道我通常不会在实际代码中这样做,但除了我目前的需要,我想知道一个漂亮而优雅的解决方案。我认为要么摆弄 list 的元类,要么在运行时改变它的功能。有没有什么方法可以做到这一点并从列表中扩展MyList,因为它使用了引擎盖下的列表方法?

1 个答案:

答案 0 :(得分:0)

您可以将一个列表包装在一个类中,并实现__len____getitem__之类的特殊container-related method names。以下是您可以实现的内容:

class MyList(object):

  def __init__(self):
    self._data = list()

  def __getitem__(self, index):
    return self._data[index+1]

  def __len__(self):
    return len(self._data)