type()方法不是python最好的判断变量类型方法吗?,typepython,用type()这种判断变
type()方法不是python最好的判断变量类型方法吗?,typepython,用type()这种判断变
用type()这种判断变量的方法,结果老鸟被鄙视了,不知所以然。
求各位讲解:这个问题出在哪里,怎样判断一个变量的类型才是好方法?
>>> n = 911>>> type(n)<type 'int'>>>> type(n) is intTrue
实际上还有一种方法是用isinstance
比如:
a = 111isinstance(a, int)True
isinstance 和 type的区别在于:
class A: passclass B(A): passisinstance(A(), A) # returns Truetype(A()) == A # returns Trueisinstance(B(), A) # returns Truetype(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 darwinType "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
编橙之家文章,
相关内容
- Python 捉虫unicode及utf-8转中文问题求解,pythonunicode,我爬
- 求助关于python装饰器返回值语法问题,python返回值,为什
- Python数据库语句查询生成与占位符使用技巧的不解之处
- Java程序调用python脚本,脚本日志如何输入到日志文件中
- Python正则表达生成器问题,python表达生成器,为什么/s
- Jinja2可以把None值显示为空字符串吗?,jinja2none,如果在
- Python 修改裁剪图片尺寸形状用什么方法,,如题,我修
- Python django + gevent应用是否要保证C++代码线程安全问题,
- python类成员函数参数类型的问题,python成员函数参数
- Python字符串切片问题求助,,关于Python的字符串
评论关闭