在Python中,一个对象有可能不是其父类的实例吗?如果是这样,如何测试?

问题描述 投票:0回答:1

以下可能吗?

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 subclass isinstance
1个回答
0
投票

在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
© www.soinside.com 2019 - 2024. All rights reserved.