我发现python中的类型检查(前py3,我不确定py3中的状态)有点乱, 这就是我的意思:
首先,有内置类型(int,str等),以及'types'模块中定义的类型,其中 你必须导入类型模块并将其用作前缀。如果你,你可以轻松跳过这个障碍 获取您正在使用的类型的“名称未定义错误”,并尝试类型模块中的类型。
然后,有一个由type()函数打印出来的名字,你无法弄清楚它们的类型 对应 - 示例:
In [38]: type(Session.__dict__['mix'])
Out[38]: staticmethod
In [39]: type(Session.__dict__['mix']) == staticmethod
Out[39]: True
好的,所以这个是内置类型。但那时:
In [47]: type(Session.__dict__['Cuser'])
Out[47]: classobj
In [48]: type(Session.__dict__['Cuser']) == classobj
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-48-b062b09548fb> in <module>()
----> 1 type(Session.__dict__['Cuser']) == classobj
NameError: name 'classobj' is not defined
In [49]: type(Session.__dict__['Cuser']) == types.classobj
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-49-2a88e0b8e176> in <module>()
----> 1 type(Session.__dict__['Cuser']) == types.classobj
AttributeError: 'module' object has no attribute 'classobj'
'classobj'没有在类型模块documentation中进行调整,
但经过一些搜索,我发现它对应types.ClassType
:
In [50]: type(Session.__dict__['Cuser']) == types.ClassType
Out[50]: True
从上面的例子看,类型检查不是那么直接,我的问题是:是否有一种更一致的方法来检查那些我不知道的类型?
答案 0 :(得分:2)
python强调duck-typing:
如果它像鸭子一样走路,像鸭子一样嘎嘎叫,它就是一只鸭子。
不是专注于类型,而是专注于属性。例如,如果hasattr(a,'next')(python 3中的hasattr(a,'__next__')
),那么你知道a
可以被视为可迭代的。