可能的重复:
对动态语言的热爱有什么用
我来自ac#/java 背景,即强类型、OOP 语言。
我对 Python 非常感兴趣,但我需要更多地了解动态语言的优点。
它真的给了我什么力量?(在网络应用程序中)。
有人可以概述我可以做的一些优势和很酷的技巧吗?
可能的重复:
对动态语言的热爱有什么用
我来自ac#/java 背景,即强类型、OOP 语言。
我对 Python 非常感兴趣,但我需要更多地了解动态语言的优点。
它真的给了我什么力量?(在网络应用程序中)。
有人可以概述我可以做的一些优势和很酷的技巧吗?
我不认为动态类型语言是“允许很酷的技巧”(他们确实如此,但大多数情况下在生产软件中使用“酷”技巧并不是很合理——它们在测试、调试等方面派上用场,但是当它涉及到为生产部署好的、快速的东西,简单的规则)。
相反,我认为这样的语言是“不妨碍我”——特别是,不会因为强迫我一遍又一遍地重复指定事物而减慢我的速度。并非所有静态类型语言都会“妨碍您”——具有可靠、逻辑正确的类型系统(例如 Haskell)的优秀语言可以让编译器推断类型(尽管如果您喜欢冗余,您可以冗余地指定它们……或者,更重要的是,如果您想要比编译器从代码中实际推断出的更严格的约束)。但是在 Java 中(以及在较小程度上在 C# 中,除非您使用合理最近的var
关键字)冗余是规则,这会影响生产力。
第三方检查系统可以为 Python 提供折衷方案,比如类型检查——我自己不使用它,但我可以看到真正认为静态类型检查增加了很多价值的人可能会对它感到满意。在最近的 Python 版本中甚至有一种语法(Python 编译器接受但不做任何事情)让您注释您的函数参数和返回值——它的目的是让这些包typecheck
被扩展以更自然地与语言本身合并(虽然我认为typecheck
还没有)。
编辑:
正如我在这里写的,我引用:
我喜欢 Van Roy 和 Haridi 的解释,p。104-106他们的书,虽然我可能同意也可能不同意他们的结论(基本上是内在差异很小——他们分别指出 Oz 和 Alice 是没有和有静态类型的互操作语言),所有的点他们做的很好。最重要的是,我相信动态类型允许真正的模块化(静态类型更难,因为类型规则必须跨模块边界强制执行),以及“在集成了多个编程范式的计算模型中进行探索性计算”。
“推荐使用动态类型”,他们总结道,“当程序必须尽可能灵活时”。我建议阅读敏捷宣言,以了解为什么在大多数现实世界的应用程序编程中最大的灵活性是至关重要的——以及为什么在所说的现实世界中,而不是在更多的学术圈中,Van Roy 博士和 Hadidi 博士进入动态类型通常是可取的,而不是像它们产生差异那样的小问题。尽管如此,他们至少比我看过的几乎任何其他书都表现出对这些问题的更多认识,花 3 页讨论它的优缺点——大多数书都以一种或另一种方式清楚地描述和预先确定了优先级,所以讨论很少像那样平衡;)。
Python(与所有动态语言一样)将属性查找推迟到运行时。这使您可以打破多态性和接口的想法,并利用鸭子类型的力量,从而您可以使用看起来应该可以工作的类型,而不必担心它的祖先或它声称要实现的内容.
Python 是强类型和面向对象的,区别在于 Python也是动态的。
在 Python 中,类与其他所有对象一样是对象,并且与其他所有对象一样,您可以在运行时创建和修改它们。这基本上意味着您可以在运行时创建和更改模块、元类、类、属性/方法和函数。您可以将基类添加到已经存在的类和其他一些东西。
不能代表 python 本身,但上周我在 Powershell 中使用 PSObject 类,它允许您动态添加成员、方法等。来自 C++\C# 背景,这似乎很神奇 - 不需要重新编译以内置这些构造,使其成为我正在做的更好的工作流程。