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