以下可能吗?
MyClass()
pass
Sub1(MyClass)
pass
Sub2(MyClass)
pass
obj = Sub1()
assert isinstance(obj, Sub1 | Sub2) and not isinstance(obj, MyClass)
也就是说,一个对象
obj
是否有可能是 Sub1
或 Sub2
的实例,而 不是 MyClass
的实例?
如果这是可能的,是否有一个测试可以针对许多子类的情况进行扩展,并且比
isinstance(obj, Sub1 | Sub2 | ... | SubN)
更简单。
issubclass(type(obj), MyClass)
是紧凑的,但不排除作为 MyClass 实例的对象,因为 类被视为其自身的子类。
在Python中,由于继承,对象始终是其父类的实例。对于
isinstance(obj, MyClass)
或其任何子类(例如 True
和 MyClass
)的对象,Sub1
检查将返回 Sub2
。
表达式
isinstance(obj, Sub1 | Sub2)
使用按位 OR,这不是检查多个类的正确方法。在 Python 3.10 及更高版本中,您可以使用 isinstance(obj, (Sub1, Sub2))
进行此类检查。
要测试
obj
是否是 MyClass
的任何子类的实例,但不是 MyClass
本身,您可以创建一个自定义函数:
class MyClass():
pass
class Sub1(MyClass):
pass
class Sub2(MyClass):
pass
def is_instance_of_subclass_only(obj, parent):
return isinstance(obj, parent) and type(obj) is not parent
obj1 = Sub1()
print(f'{obj1 = }')
print(f'{is_instance_of_subclass_only(obj1, MyClass) = }')
obj2 = MyClass()
print(f'{obj2 = }')
print(f'{is_instance_of_subclass_only(obj2, MyClass) = }')
输出:
obj1 = <__main__.Sub1 object at 0x7f1c52d67f70>
is_instance_of_subclass_only(obj1, MyClass) = True
obj2 = <__main__.MyClass object at 0x7f1c52d67eb0>
is_instance_of_subclass_only(obj2, MyClass) = False