在Python 2.5中创建“类型化”列表

0 投票
2 回答
640 浏览
提问于 2025-04-17 03:41

我知道在C#中怎么用语法来创建一个字符串列表,比如用 List<string> MyList 这样的方式。

那么在Python中有没有类似的语法,如果我试图添加一个不属于这个类型的东西,它会报错呢?

2 个回答

1

不可以。你需要创建一个自定义的类,并且要正确地实现一些特殊的方法,叫做 __*item__() 方法。具体的内容可以参考这个链接。

1

正如其他人所说,Python里没有内置类似的功能。

如果你想要实现这样的功能,你可以从内置的 list() 类继承,重写一些方法,让它们在插入或添加元素时检查类型。或者,你也可以选择不检查类型,而是让你自定义的方法尝试将类型转换。

下面是一个示例,展示了一个只能存放 int() 值的列表。它会将你尝试插入或添加的任何东西进行类型转换,如果不成功就会抛出相应的错误。我是从内置的 list() 类型继承的,所以我写的代码只是处理异常;你在这里看不到的部分,和基础的 list() 类型完全一样。我只需要重写几个方法。我还给它添加了一个自定义的 .__init__() 方法,可以接受一个列表或其他序列来初始化这个对象。

这个实现并不完整;比如,它没有重写 .insert() 方法。但我认为它展示了基本的思路,如果你真的想要一个 IntList() 类,可以用这个作为基础。

class IntList(list):
    def __init__(self, seq=None):
        if seq is not None:
            try:
                for x in seq:
                    self.append(int(x))
            except ValueError:
                raise ValueError, "can only use int values to init IntList"
    def __setitem__(self, i, x):
        try:
            list.__setitem__(self, i, int(x))
        except ValueError:
            raise ValueError, "can only set int values into IntList"
    def append(self, x):
        try:
            list.append(self, int(x))
        except ValueError:
            raise ValueError, "can only append int values to IntList"


lst = [0, 1, 't']

try:
    o = IntList(lst) # raises exception
except ValueError:
    print("lst has a 't' in it")

o = IntList(range(3))  # works

try:
    o[1] = 't'
except ValueError:
    print("cannot set to 't'")

o[1] = 2  # works

o.append(4)  # works
o.append('t') # raises error

上面的代码输出:

lst has a 't' in it
cannot set to 't'
Traceback (most recent call last):
  File "t.py", line 38, in <module>
    o.append('t') # raises error
  File "t.py", line 18, in append
    raise ValueError, "can only append int values to IntList"
ValueError: can only append int values to IntList

在 Python 中,有一个常见的写法是给 .__init__() 函数的列表参数设置默认值为 None。这是因为默认值列表只在编译时评估一次,如果保存这个列表的引用,就意味着这个类的每个实例共享同一个列表。在这种情况下,由于我们有一个 for 循环在迭代,构建自己的副本,我其实不需要使用这个写法;但我想给新手们举个例子,帮助他们理解这个写法。

撰写回答