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

A-P*_*A-P 9 python inheritance class python-3.4

我有这个代码:

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)
Run Code Online (Sandbox Code Playgroud)

现在我要检查,如果obj2obj3是的是的子类的实例obj1,以及简单的子类Item.

以下是我的理解,我知道我可以使用isinstance()找到,如果obj2Sub.而且我知道我可以使用issubclass(Sub, Item).但是,假设我不知道上课obj2是什么.

我尝试使用,issubclass(type(obj2),Item)但这不起作用,因为type()返回一个单独的对象,我真的不明白的工作原理.这只是一个问题,虽然我认为这个问题的答案将帮助我解决我遇到的其他一些问题.

此外,我尝试使用一些特殊属性来做到这一点,__class__但我无法弄清楚如何做到这一点.

Mar*_*ers 13

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

isinstance(obj2, type(obj1))
Run Code Online (Sandbox Code Playgroud)

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

issubclass() 适用于您的用例:

issubclass(type(obj2), Item)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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
Run Code Online (Sandbox Code Playgroud)

请注意,如果在此处重新定义了类,则不会更新现有实例以指向新的类对象.如果type(obj2)不适合你,那么这意味着用于生成它的类与你现在测试的类不同.

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

>>> type(obj1) is Item
True
>>> type(obj2) is Sub
True
>>> type(obj3) is SubSub
True
Run Code Online (Sandbox Code Playgroud)