如何检查新实例化的类是正确的数据类型(python)

1 投票
1 回答
901 浏览
提问于 2025-04-16 15:22

我想创建一个类,这个类只能接受特定格式的数据,如果格式不对,就返回错误。比如说,

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 个回答

4

在Python中,使用鸭子类型是很常见的,所以通常不建议检查类型,除非真的有必要。一般来说,如果一个参数必须是某种特定类型,最好假设用户提供的类型是正确的。这样,用户可以提供一些不完全正确但仍然能用的东西,同时你也可以使用模拟对象来进行测试。在你的例子中,你可以直接写:self.tagged = list(input)。这个list构造函数可以接受各种各样的序列(用户可能想用的,但可能不完全符合你的需求),然后把它转换成一个列表。

不过,有时候你确实需要做某种检查。例如,如果这个函数应该接受列表或字典,并根据你提供的类型做不同的事情。在这种情况下,你可以使用Python的抽象基类系统。可以查看collectionsnumbers模块中的类。使用这些,你可以用isinstance来检查某个东西是否是Sequence(序列)、Mapping(映射)或Number(数字),而不需要明确列出所有可能性。你可能注意到,listdictint类实际上并不直接继承自SequenceMappingNumber,但这没关系——抽象类可以决定哪些类算作其子类,以便用于isinstance函数。你可以使用abc模块来定义这种新的抽象类。所以,如果你需要对一组特定的类进行很多检查,定义一个将它们归为自己的抽象类可能会更简单、更清晰。然后,后来你可以向这个抽象类添加更多的类(或程序化检查),以覆盖更多的情况,而不需要更新所有需要进行检查的地方。

撰写回答