作者:双木子婷_893 | 来源:互联网 | 2023-10-16 14:24
回复内容:
请先理解以下基本概念:
- python是强类型;
- 泛型是啥。
- Python 是强类型的
- Python 不需要泛型是因为 Python 的变量签名是动态的,有 lazy binding 效果。比如一个函数传入 connection 参数,然后函数中调用 connection.close() 。直到你调用这个函数的时候(运行期),虚拟机才会去查找 close 方法,而不是像静态类型语言一样在编译期或装载期就事先建立符号表。
一句话:
泛型是一种类型声明的表达方法。Python不声明类型,所以你想找泛型也没处找去。跟强/弱类型和静态/动态都没有直接联系。
一般的解释语言为了编程的灵活性,都没有类型声明。这是被变量都要声明类型的语言坑惨的程序汪的报复。比如说Java,一屏幕代码,四分之一都是没啥信息量的局部变量类型声明,光看都要瞎了有没有。
但是类型声明还是有好处的啊,写Python的程序员肯定遇到过处理exception(比如连不上服务器)的代码里类型错误,结果程序写的时候好好的,跑的时间一长就类型错误,简直吐血三升有木有。有类型声明的话,写的时候就能发现错误了。
所以呢,解释语言的程序汪们就又往语言里加可选的类型声明了。比如
Python有mypy,既有泛型又有duck-typing,简直左牵黄右擎苍啊。以后再也不要说我们解释语言不做类型检查了,是我们不爱做而已。
mypy - Optional Static Typing for Python
“不需要泛型”和强/弱类型无关,另外一般认为Python是强类型
泛型属于多态的概念。广义的多态包括:Ad-hoc多态(函数重载),参数化多态(泛型),子类型多态。
泛型是指:函数的类型签名中可以包含类型变量,使用时类型变量会被静态地替换成具体类型,而针对不同具体类型的函数体是一模一样的。
如C++的template,T是类型变量
T max(T x, T y)
{
return x < y ? y : x;
}
先来看看为啥Java需要Generics?
官网有解答:http://docs.oracle.com/javase/tutorial/java/generics/why.html
总的来说,Generics根据这个解释,主要作用就是在编译期做类型检查+避免不必要的类型转换。
Python(2.x)的确切的类型信息本身要等到运行时才会暴露出来,自然编译期做类型检查也就没有意义了。
Duck Typing, C++ 式的编译期泛型和 Java Collection Framework 1.4 之前的基于接口的做法,目的相似,手段不同而已。
http://en.wikipedia.org/wiki/Duck_typing
因为Python是动态类型,所以天然就是支持泛型支持泛型的。但是动态类型语言,都自然支持泛型
python/ruby 都是强类型的……php是弱的
看了一些回答后,再次感叹python的确又是一个类似C++那般被国外再到国内被误解相当深的编程语言工具。
1. 为变量指定数据类型称为“强类型”,但此形式并不代表该编程语言类型系统一定更强大。Python有一个统一的、明确的、强大的类型系统,比Java的类型系统更强。
2. 见你这样问,显然对“泛型”的理解只是形式上的,建议你还是认真看看其定义和目的、意义:http://zh.wikipedia.org/zh-cn/%E6%B3%9B%E5%9E%8B。