在Python 2.5中创建“类型化”列表
我知道在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
循环在迭代,构建自己的副本,我其实不需要使用这个写法;但我想给新手们举个例子,帮助他们理解这个写法。