动态语言如Python能给你什么?来自C#/Java背景的我求指教!
可能重复的问题:
动态语言有什么魅力
我之前主要使用的是C#和Java,也就是那种类型非常严格的面向对象编程语言。
我对Python非常感兴趣,但我想多了解一下动态语言的优点。
它到底能给我带来什么好处?(特别是在网页应用方面)。
有没有人能简单列出一些优点和我可以做的有趣的事情?
5 个回答
Python(和所有动态语言一样)会把查找属性的过程推迟到程序运行时。这意味着你可以超越多态和接口的概念,利用一种叫做鸭子类型的特性。简单来说,鸭子类型允许你使用一种看起来像能工作的类型,而不需要担心它的来源或者它声称实现了什么。
我不认为动态类型语言是“允许一些炫酷的技巧”(它们确实允许,但在生产软件中使用这些“炫酷”技巧并不太靠谱——它们在测试、调试等方面很有用,但在部署高效、优质的产品时,简单才是王道)。
我更倾向于把这些语言看作是“不会妨碍我”——特别是,它们不会因为让我重复指定一些东西而拖慢我的速度。并不是所有的静态类型语言都会“妨碍你”——像Haskell这样有着稳固、逻辑严谨类型系统的好语言,允许编译器推断类型(当然,如果你喜欢冗余,也可以重复指定类型……或者更准确地说,如果你想要比编译器从代码中推断出的更严格的约束)。但在Java中(在C#中情况稍微好一点,除非你使用最近的var
关键字),冗余是常态,这会影响生产效率。
对于Python,第三方的检查系统可以提供一种折中方案,比如typecheck——我自己不使用这个,但我能理解那些认为静态类型检查能带来很多价值的人可能会对此感到满意。在最近的Python版本中,甚至有一种语法(Python编译器接受但不处理)可以让你给函数的参数和返回值添加注释——其目的是让像typecheck
这样的包能够更自然地与语言本身结合(不过我觉得typecheck
现在还没有做到这一点)。
编辑:
正如我在这里写的,我引用:
我喜欢Van Roy和Haridi在他们的书中第104-106页的解释,尽管我可能同意或不同意他们的结论(他们的结论基本上是内在的差异微乎其微——他们指出Oz和Alice分别是没有静态类型和有静态类型的可互操作语言),但他们提出的所有观点都很好。最重要的是,我相信,动态类型允许真正的模块化(静态类型更难做到,因为类型规范必须在模块边界之间强制执行),以及“在一个整合了多种编程范式的计算模型中进行探索性计算”。
他们总结道:“当程序必须尽可能灵活时,推荐使用动态类型。”我建议阅读敏捷宣言,以理解为什么在大多数实际应用编程中,最大灵活性至关重要——因此,在实际世界中,而不是在Van Roy博士和Hadidi博士所处的更学术的圈子里,动态类型通常更受欢迎,而不是他们所说的那种微不足道的问题。尽管如此,他们至少在讨论这个问题时表现出更多的意识,花了3页精彩的讨论,讲述了优缺点,比我见过的几乎任何其他书籍都要好——大多数书籍要么明确划定了优先级,要么形成了某种倾向,因此讨论往往没有那么平衡;)。