回复内容:
请先理解以下基本概念: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。