网站地图 联系我们

学习python首选-实战python学习班,专注于python高级工程师培养,python课程:包括Python核心编程技术、全栈开发、网络爬虫、人工智能等。python全栈工程师+提高工作经验,获取免费试听课程!
当前位置: python培训 > python学习 > 常见问题 > 正文

type()方法不是python最好的判断变量类型方法吗?

来源:肚皮舞 浏览量: 发布日期:20-08-31 10:51:58 调整字体大小【 【所属栏目:常见问题】

  用type()这种判断变量的方法,结果老鸟被鄙视了,不知所以然。

  求各位讲解:这个问题出在哪里,怎样判断一个变量的类型才是好方法?

  >>> n = 911

  >>> type(n)

  

  >>> type(n) is int

  True

  实际上还有一种方法是用isinstance

  比如:

  a = 111

  isinstance(a, int)

  True

  isinstance 和 type的区别在于:

  class A:

  pass

  class B(A):

  pass

  isinstance(A(), A) # returns True

  type(A()) == A # returns True

  isinstance(B(), A) # returns True

  type(B()) == A # returns False

  区别就是 对于subclass之类的 type就不行事了

  你说的老鸟 应该是这个意思吧? [颤抖ing]

  和Python的new-style class有关。相关链接 http://www.python.org/doc/newstyle/

  以下代码在Python2.5中执行:

  >>> class A:

  ... pass

  ...

  >>> a = A()

  >>> class B:

  ... pass

  ...

  >>> b = B()

  >>> type(a) is type(b)

  True

  >>>

  在old-style class中,任意instance的type都是'instance'。所以绝对不能用type来判断其类型。

  另外这个问题又与Python的思想有关,正常情况下不应该编写代码检查类型的,而应该直接假设被操作的instance具有你希望的属性,否则抛出异常。即使需要检查类型,也应该用isinstance来判断,这样你期望类型的subclass也能正常被处理(比如,一个函数需要处理Message类型,那么它应该也能处理Message的子类型MyMessage,所以应该使用isinstance(arg,Message)这样来判断而不是type(arg) == Message来判断)

  参考Duck Typing http://en.wikipedia.org/wiki/Duck_typ...

  另外这个问题还与metaclass有关,但是我实在想不起来在哪个地方会导致type()返回的不是type这个class的instance了…待补充…

  UPDATE:

  又找到这段例子,供参考

  Python 2.7.3 (default, May 12 2012, 00:10:31)

  [GCC 4.2.1 (Gentoo 4.2.1_p5666, Apple Inc. build 5666) (dot 3)] on darwin

  Type "help", "copyright", "credits" or "license" for more information.

  >>> from collections import Iterator

  >>> class A(object):

  ... def __iter__(self):

  ... pass

  ... def next(self):

  ... pass

  ...

  >>> isinstance(A(), Iterator)

  True

标签:
肚皮舞新闻动态News Center

肚皮舞视频

肚皮舞培训课程

联系卡伊丝contact us
联系我们
python培训「零基础入门到精通」python人工智能编程培训班-0798wz.com

咨询热线:18301225663