测试一个对象是另一个实例类型的子类

2024-06-01 01:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个密码:

class Item:
    def __init__(self,a):
        self.a=a

class Sub(Item):
    def __init__(self,a,b):
        self.b=b
        Item.__init__(self,a)

class SubSub(Sub):
    def __init__(self,a,b,c):
       self.c=c
       Sub.__init__(self,a,b)

obj1=Item(1)
obj2=Sub(1,2)
obj3=SubSub(1,2,3)

现在我要检查obj2obj3是否是类的实例,这些类是obj1的子类,也只是Item的子类。

这是我的理解,我知道我可以使用isinstance()来查找obj2是否是Sub。我知道我可以用issubclass(Sub, Item)。但假设我不知道什么是类obj2

我试过使用issubclass(type(obj2),Item)但这不起作用,因为type()返回了一个单独的对象,我并不真正理解它的工作原理。这只是一个问题,尽管我认为这个问题的答案将帮助我解决我所面临的其他一些问题。

此外,我还尝试使用一些特殊属性来执行此操作,例如__class__,但我也不知道如何执行此操作。


Tags: 实例self密码initdeftypeitem子类
1条回答
网友
1楼 · 发布于 2024-06-01 01:54:03

您需要使用type()函数提取obj的类型:

isinstance(obj2, type(obj1))

注意第二个参数是类,第一个是要测试的实例。type()返回的是实际的类对象,而不是任何单独的对象。

issubclass()对于您的用例来说非常有用:

issubclass(type(obj2), Item)

演示:

>>> class Item:
...     def __init__(self,a):
...         self.a=a
... 
>>> class Sub(Item):
...     def __init__(self,a,b):
...         self.b=b
...         Item.__init__(self,a)
... 
>>> class SubSub(Sub):
...     def __init__(self,a,b,c):
...        self.c=c
...        Sub.__init__(self,a,b)
... 
>>> obj1=Item(1)
>>> obj2=Sub(1,2)
>>> obj3=SubSub(1,2,3)
>>> isinstance(obj2, type(obj1))
True
>>> issubclass(type(obj2), Item)
True

注意,如果在这里重新定义了类,那么现有实例将被更新为指向新的类对象。如果type(obj2)对您不起作用,那么这意味着用于生成它的类与您现在测试的类不同。

您可以通过测试您的假设来测试这种情况;验证类和实例是否仍然同步,例如:

>>> type(obj1) is Item
True
>>> type(obj2) is Sub
True
>>> type(obj3) is SubSub
True

相关问题 更多 >