qyuhen / book

学习笔记
12.52k stars 3.42k forks source link

Python 是强类型、动态类型的吧? #42

Open OwenChia opened 8 years ago

OwenChia commented 8 years ago

《Python 学习笔记》第五章开头(P74)写道「因为 "弱类型" 和 "Duck Type" 的缘故」,但 Python 应该是强类型吧?

参考: Why is Python a dynamic language and also a strongly typed language Is Python strongly typed?

choleraehyq commented 8 years ago

你理解的不对。第一种情况是动态类型。 Python就是强类型动态类型的语言。 2016年3月6日 下午6:09,"仇柯人" notifications@github.com写道:

这么看python就是弱类型

a="a" print a a a=1 print a

这么看就是强类型

"a"+1 Traceback (most recent call last): File "", line 1, in TypeError: cannot concatenate 'str' and 'int' objects

— Reply to this email directly or view it on GitHub https://github.com/qyuhen/book/issues/42#issuecomment-192866231.

dinever commented 8 years ago

弱类型(Javascript):

> "1" + 2
'12'

强类型(Python):

>>> "1" + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
qiukeren commented 8 years ago

@choleraehyq, 没错,我理解错了,所以那个评论我就删掉了,怎么还有记录…… ===== 是邮箱记录……

qyuhen commented 8 years ago

嗯,我的描述有些不准确。但因为 python 支持操作符重载缘故,所以具备某些弱类型特征。

In [1]: class X:
   ...:     def __add__(self, other):
   ...:         return other + 100
   ...:     

In [2]: x = X()

In [3]: x + 5
Out[3]: 105
qyuhen commented 8 years ago

还有一个比较特别的是,__class__ 在运行期是可以被改变的,从而转换门庭换个类型。

In [12]: class X: pass

In [13]: class Y: pass

In [14]: x = X()

In [15]: type(x)
Out[15]: __main__.X

In [16]: x.__class__ = Y

In [17]: type(x)
Out[17]: __main__.Y
wizardforcel commented 8 years ago

这个应该给个注解,很多人都有这样的问题

lynnboy commented 8 years ago

"1" + 2 == "12" 这样的是运算符的性质,和对象的类型系统本身无关 类型系统是没有公认的“强/弱”划分的 一般对“强类型系统”的认识多数集中于“类型检查没有或很少有被欺骗的机会” 从这方面看,python是纯动态的类型系统,而类型系统本身基本上完全保护了所有的对象值,可以认为是属于“强类型系统”特征的 不过“Duck typing”即类型多态性又有意放松了类型兼容性规则,这个方面来说,它又是非常“弱”的