所以我希望这是一个有效的问题......我最近(今天实际上)决定学习脚本语言,所以我选择了Python。在浏览代码时,我感到不知所措,我很快意识到原因是我不知道 数据类型转换和内容正在发生什么。
我的问题是:是否存在跟踪数据类型的常规?我来自更多的C背景,所以我发现这很令人困惑。有什么提示吗?
答案 0 :(得分:6)
正常的Python方法是duck typing
- 来自旧句子“如果它像鸭子一样嘎嘎叫,像鸭子一样走路,那对我来说就足够了”。
在特殊情况下,你真的必须检查某些类型是什么(对其他相似的类型做不同的事情......通常不是一个好主意),这就是isinstance的用途
isinstance
曾经被认为是最后的措施,并且严重警告不要过度使用它...但是虽然经典长篇大论的要点仍然有效,但是从Python 2.6开始,它已经获得了一个重要的条件:如果某个特定具体类的实例仍然存在于“很少有好主意”类别中,那么检查它是否是abstract base class(也就是ABC)的实例是一个更常用的想法,因为它只是提供了一个很好的并且可以灵活地检查某些东西是否实现某些界面。
例如,要检查对象是否可调用,过去必须执行以下操作:
if hasattr(type(obj), '__call__'): ...
自2.6以来,首选替代方案已成为:
import collections
if isinstance(obj, collections.Callable): ...
更直接,更清洁。更富有的ABCs,例如collections.MutableSequence
,意味着许多不同方法的存在和协调,使得这种指数更强。
检查(使用isinstance
)具体类型中的成员资格的事实并不是那么好,而检查ABC中的成员资格通常更有用,其原因在于“4人帮”表达的原则在他们精彩的书籍“设计模式”的第一部分中清晰而强烈地(在一个主要是C ++语境中,但它实际上应用得更广泛!):编程到界面,而不是实现
检查具体类的成员资格表明您可能对实现的编程感到内疚;使用ABC,你基本上都在检查一个接口,所以很多问题不再是大问题(ABCs不仅仅是接口 - 它们还可以为它们的具体子类提供“实现帮助” - 但是,当我们在谈论isinstance
时,将它们视为接口可能是最有帮助的立场。
答案 1 :(得分:0)
使用isinstance(object, classinfo)
和type(object)
。