代码之家  ›  专栏  ›  技术社区  ›  Dominic K

跟踪python中的数据类型

  •  3
  • Dominic K  · 技术社区  · 16 年前

    所以我希望这是一个有效的问题…我最近(实际上今天)决定学习脚本语言,所以我选择了Python。当我浏览代码时,我感到不知所措,很快我意识到原因是我不知道 什么 正在进行数据类型转换和相关工作。

    我的问题是:是否有保持跟踪数据类型的惯例?我来自C背景,所以我觉得这很困惑。有什么小窍门吗?

    2 回复  |  直到 16 年前
        1
  •  6
  •   Alex Martelli    16 年前

    正常的python方法是 duck typing --从古老的短语“如果它像鸭子一样嘎嘎叫,像鸭子一样走路,对我来说就够鸭子了”。

    在特殊情况下, 必须 检查什么类型的东西(对其他相似类型做不同的事情…通常不是个好主意),这就是 isinstance 是为了。

    isinstance 以前被认为是最后的措施,严重警告不要过度使用它…但是,尽管这篇经典长篇演讲的要点仍然有效,但自从Python2.6以来,它已经获得了一个重要的限制:当检查某个东西是否是某个特定具体类的实例时,它仍然属于“很少是好主意”类别,检查它是否是 abstract base class (又名abc)是一个更为常用的想法,因为它只是提供了一种好的、灵活的方法来检查某个东西是否实现了某个接口。

    例如,要检查对象是否可调用,必须执行以下操作:

    if hasattr(type(obj), '__call__'): ...
    

    自2.6以来,首选方案已成为:

    import collections
    if isinstance(obj, collections.Callable): ...
    

    更直接更干净。更丰富的ABC,例如, collections.MutableSequence 这意味着许多不同方法的存在和协调,使其指数级更强。

    事实上, 实例 一个具体类型的成员不太好,而检查ABC中的成员更为有用,这一原则在于“4帮”在他们精彩的书“设计模式”的第一部分中表达得非常清楚和强烈(在大多数C++上下文中,但它确实比这更广泛地应用了!): 程序到接口,而不是实现 .

    检查一个具体类的成员资格表明你可能对一个实现进行编程感到内疚;对于一个ABC,你基本上是在检查一个接口,所以许多问题不再是大问题了(ABC不仅仅是接口——它们还可以为它们的具体子类提供“实现帮助”——但是,当我们讨论关于 实例 把它们看作接口可能是最有用的立场)。

        2
  •  0
  •   histrio    16 年前