gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:15:37 25 4
gpt4 key购买 nike

我有这个代码:

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 的简单子(monad)类.

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

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

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

最佳答案

您需要使用 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

关于python - 测试一个对象是另一个实例类型的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27475063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com