这里对这两个函数做一个简单的探索。通过这个练习,我发现它很有启发性。我经常会创建一个简单的程序来探索简单函数的来龙去脉并保存以供参考:
#
# Testing isinstance and issubclass
#
class C1(object):
def __init__(self):
object.__init__(self)
class B1(object):
def __init__(self):
object.__init__(self)
class B2(B1):
def __init__(self):
B1.__init__(self)
class CB1(C1,B1):
def __init__(self):
# not sure about this for multiple inheritance
C1.__init__(self)
B1.__init__(self)
c1 = C1()
b1 = B1()
cb1 = CB1()
def checkInstanceType(c, t):
if isinstance(c, t):
print c, "is of type", t
else:
print c, "is NOT of type", t
def checkSubclassType(c, t):
if issubclass(c, t):
print c, "is a subclass of type", t
else:
print c, "is NOT a subclass of type", t
print "comparing isinstance and issubclass"
print ""
# checking isinstance
print "checking isinstance"
# can check instance against type
checkInstanceType(c1, C1)
checkInstanceType(c1, B1)
checkInstanceType(c1, object)
# can check type against type
checkInstanceType(C1, object)
checkInstanceType(B1, object)
# cannot check instance against instance
try:
checkInstanceType(c1, b1)
except Exception, e:
print "failed to check instance against instance", e
print ""
# checking issubclass
print "checking issubclass"
# cannot check instance against type
try:
checkSubclassType(c1, C1)
except Exception, e:
print "failed to check instance against type", e
# can check type against type
checkSubclassType(C1, C1)
checkSubclassType(B1, C1)
checkSubclassType(CB1, C1)
checkSubclassType(CB1, B1)
# cannot check type against instance
try:
checkSubclassType(C1, c1)
except Exception, e:
print "failed to check type against instance", e
编辑:
还要考虑以下内容,因为 isinstance 可能会破坏 API 实现。一个例子是一个像字典一样的对象,但不是从 dict 派生的。 isinstance 可能会检查对象是否为字典,即使该对象支持字典样式访问:
isinstance considered harmful
编辑2:
谁能给我一个例子来说明传递一个类型作为第二个参数和传递一个对象之间的区别?
在测试了上面的代码后,它告诉我第二个参数必须是一个类型。所以在以下情况下:
checkInstanceType(c1, b1)
调用将失败。可以写成:
checkInstanceType(c1, type(b1))
因此,如果您想检查一个实例与另一个实例的类型,您必须使用 type() 内置调用。