如何检查新实例化的类是正确的数据类型(python)
我想创建一个类,这个类只能接受特定格式的数据,如果格式不对,就返回错误。比如说,
class Sentence:
def __init__(self, input):
self.initial_input = input
## Check and assign input
if isinstance(input, (list, tuple)):
self.tagged = input
else: raise TypeError, ('Input must be a list.')
这段代码似乎能完成这个任务,但我在想有没有更好的方法来实现这个功能,可能是利用Python类的一些内置特性。因为我有很多参数需要特定格式,所以我的 def __init__
方法写起来变得相当复杂。这样处理新类对象的初始化检查,有什么不好的地方吗?我试着找了很多资料,但没找到太多相关的信息。
1 个回答
在Python中,使用鸭子类型是很常见的,所以通常不建议检查类型,除非真的有必要。一般来说,如果一个参数必须是某种特定类型,最好假设用户提供的类型是正确的。这样,用户可以提供一些不完全正确但仍然能用的东西,同时你也可以使用模拟对象来进行测试。在你的例子中,你可以直接写:self.tagged = list(input)
。这个list
构造函数可以接受各种各样的序列(用户可能想用的,但可能不完全符合你的需求),然后把它转换成一个列表。
不过,有时候你确实需要做某种检查。例如,如果这个函数应该接受列表或字典,并根据你提供的类型做不同的事情。在这种情况下,你可以使用Python的抽象基类系统。可以查看collections和numbers模块中的类。使用这些,你可以用isinstance
来检查某个东西是否是Sequence
(序列)、Mapping
(映射)或Number
(数字),而不需要明确列出所有可能性。你可能注意到,list
、dict
和int
类实际上并不直接继承自Sequence
、Mapping
和Number
,但这没关系——抽象类可以决定哪些类算作其子类,以便用于isinstance
函数。你可以使用abc模块来定义这种新的抽象类。所以,如果你需要对一组特定的类进行很多检查,定义一个将它们归为自己的抽象类可能会更简单、更清晰。然后,后来你可以向这个抽象类添加更多的类(或程序化检查),以覆盖更多的情况,而不需要更新所有需要进行检查的地方。