Python issubclass,在传递实例而不是类时返回False

Python issubclass,在传递实例而不是类时返回False,python,class,subclass,Python,Class,Subclass,我想让issubclass按如下方式工作:如果原始的issubclass接收到一个实例而不是一个类,它只返回False。我是否需要编写一个类似下面的函数,或者有更好的方法来实现 def my_issubclass(cls, parent): try: return issubclass(cls, parent) except: # issubclass() arg 1 must be a class return False issubclass

我想让
issubclass
按如下方式工作:如果原始的
issubclass
接收到一个实例而不是一个类,它只返回False。我是否需要编写一个类似下面的函数,或者有更好的方法来实现

def my_issubclass(cls, parent):
    try:
        return issubclass(cls, parent)
    except: # issubclass() arg 1 must be a class
        return False
issubclass()
设计用于在第一个参数不是类时引发异常,因此是的,如果传入其他参数,它将引发
TypeError
。这是因为在大多数上下文中,混合类(类型)和实例会表明某个地方存在bug

因此,您可以选择捕获该异常(并且仅捕获该异常,不要在这里玩口袋妖怪,您不想捕获所有异常):

或者,您可以首先检查您是否确实有一个类:

def my_issubclass(obj, type_or_types):
    return isinstance(obj, type) and issubclass(obj, type_or_types)
第一种形式被称为请求原谅比请求许可或EAFP更容易,第二种形式是三思而后行,LBYL。您选择哪一个部分基于样式首选项,部分基于性能考虑。如果不经常在实例而不是类中使用它,那么使用第一种形式,否则使用第二种形式。请参阅我对软件工程的回答

使用
bool
int
快速演示(是的,布尔类型是整数的子类):

issubclass()
设计用于在第一个参数不是类时引发异常,因此是的,如果传入其他参数,它将引发
TypeError
。这是因为在大多数上下文中,混合类(类型)和实例会表明某个地方存在bug

因此,您可以选择捕获该异常(并且仅捕获该异常,不要在这里玩口袋妖怪,您不想捕获所有异常):

或者,您可以首先检查您是否确实有一个类:

def my_issubclass(obj, type_or_types):
    return isinstance(obj, type) and issubclass(obj, type_or_types)
第一种形式被称为请求原谅比请求许可或EAFP更容易,第二种形式是三思而后行,LBYL。您选择哪一个部分基于样式首选项,部分基于性能考虑。如果不经常在实例而不是类中使用它,那么使用第一种形式,否则使用第二种形式。请参阅我对软件工程的回答

使用
bool
int
快速演示(是的,布尔类型是整数的子类):


您可以预先检查
cls
是否实际上是一个类(
isinstance(cls,type)
),但这是一个哲学问题。除此之外,我不知道你为什么要这么做?你可以预先检查
cls
是否是一个类(
isinstance(cls,type)
),但这是一个哲学问题。不能做更多了,我不知道你为什么要这么做?
>>> def my_issubclass_eafp(obj, type_or_types):
...     try:
...         return issubclass(obj, type_or_types)
...     except TypeError:  # issubclass() arg 1 must be a class
...         return False
...
>>> def my_issubclass_lbyl(obj, type_or_types):
...     return isinstance(obj, type) and issubclass(obj, type_or_types)
...
>>> my_issubclass_eafp(1, int)
False
>>> my_issubclass_eafp(bool, int)
True
>>> my_issubclass_lbyl(1, int)
False
>>> my_issubclass_lbyl(bool, int)
True