首页 > 解决方案 > 检查项目是否是实例但不是子类

问题描述

你如何检查一个对象是否是一个类的实例而不是它的任何子类(不知道子类的名称)?因此,如果我有以下代码:

def instance_but_not_subclass(object, class):
    #code
    return result

class item(object):
    
class item_2(item):

...

class item_n(item): 

a = item()
b = item_2()
...
c = item_n()

instance_but_not_subclass(a, item)
instance_but_not_subclass(b, item)
...
instance_but_not_subclass(c, item)

#code产生输出的空间会发生什么?:

True
False
...
False

因为issubclass()isinstance()总是回报True

标签: pythonpython-3.xclassisinstance

解决方案


object.__class__属性是对对象确切类的引用,因此您只需将其与您的参数进行比较

def instance_but_not_subclass(obj, klass):
    return obj.__class__ is klass

不要命名 variables class,它是一个关键字,并且不起作用,使用klassortyp代替。此外,变量名称object会影响构建object,因此请使用类似obj.


我个人更喜欢这个.__class__变体,但更“pythonic”的变体可能是

def instance_but_not_subclass(object, klass):
    return type(obj) is klass

因为它不访问任何 dunder ( __) 属性。


推荐阅读