基本上我想这样做:

obj = 'str'
type ( obj ) == string

我试着:

type ( obj ) == type ( string )

但这并没有起作用。

还有,其他类型的呢?例如,我无法复制NoneType。


当前回答

Type在某些类上不起作用。如果你不确定对象的类型,使用__class__方法,如下所示:

>>>obj = 'a string'
>>>obj.__class__ == str
True

也请参阅这篇文章- http://www.siafoo.net/article/56

其他回答

使用str代替string

type ( obj ) == str

解释

>>> a = "Hello"
>>> type(a)==str
True
>>> type(a)
<type 'str'>
>>>

您可以比较类的检查级别。

#!/usr/bin/env python
#coding:utf8

class A(object):
    def t(self):
        print 'A'
    def r(self):
        print 'rA',
        self.t()

class B(A):
    def t(self):
        print 'B'

class C(A):
    def t(self):
        print 'C'

class D(B, C):
    def t(self):
        print 'D',
        super(D, self).t()

class E(C, B):
    pass

d = D()
d.t()
d.r()

e = E()
e.t()
e.r()

print isinstance(e, D) # False
print isinstance(e, E) # True
print isinstance(e, C) # True
print isinstance(e, B) # True
print isinstance(e, (A,)) # True
print e.__class__ >= A, #False
print e.__class__ <= C, #False
print e.__class__ <  E, #False
print e.__class__ <= E  #True

因为你必须写作

s="hello"
type(s) == type("")

Type接受实例并返回其类型。在这种情况下,您必须比较两个实例的类型。

如果需要执行抢占式检查,最好检查受支持的接口,而不是类型。

除了你的代码需要一个特定类型的实例之外,类型并没有真正告诉你什么,不管你可以有另一个完全不同类型的实例,这是完全没问题的,因为它实现了相同的接口。

例如,假设您有以下代码

def firstElement(parameter):
    return parameter[0]

现在,假设您说:我希望这段代码只接受一个元组。

import types

def firstElement(parameter):
    if type(parameter) != types.TupleType:
         raise TypeError("function accepts only a tuple")
    return parameter[0]

这降低了这个例程的可重用性。如果你传递一个列表,或者字符串,或者numpy。array,它就不起作用。更好的做法是

def firstElement(parameter):
    if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
        raise TypeError("interface violation")
    return parameter[0]

但是这样做没有任何意义:如果协议不满足,参数[0]将引发异常……当然,除非您想防止副作用,或者必须从失败前可能调用的调用中恢复。(愚蠢的)例子,只是为了说明这一点:

def firstElement(parameter):
    if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
        raise TypeError("interface violation")
    os.system("rm file")
    return parameter[0]

在这种情况下,您的代码将在运行system()调用之前引发异常。如果没有接口检查,您将删除该文件,然后引发异常。

因为type返回一个对象,所以可以使用object.name访问对象的名称

例子:

years = 5
user = {'name':'Smith', 'age':20}

print(type(a).__name__) 

输出:“int”

print(type(b).__name__ )

输出:“东西”

isinstance()

在你的例子中,isinstance("this is a string", str)将返回True。

你可能还想读这个:http://www.canonical.org/~kragen/isinstance/