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