【问题标题】:Test an object is a subclass of the type of another instance测试一个对象是另一个实例类型的子类
【发布时间】:2015-02-13 00:27:09
【问题描述】:

我有这个代码:

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__,但我也不知道该怎么做。

【问题讨论】:

    标签: python class inheritance python-3.4


    【解决方案1】:

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

    isinstance(obj2, type(obj1))
    

    注意,second 参数是类,第一个是要测试的实例。 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
    

    【讨论】:

    • 好吧,这行不通。 type() 函数究竟返回什么,据我了解,它返回一个我认为不能在此设置中使用的单独对象。
    • @A-P:要么你把一些对象弄混了(可能是导入还是本地定义?),但是type() 生成一个单独的对象。如果是,那么您没有从您正在测试的类中创建该实例
    • @A-P:如果您重新定义了类但没有重新创建实例,那么这些实例仍将引用 old 类定义。听起来你就是这种情况。
    • 好的,我认为这是我遇到的一些奇怪的定义问题,因为一旦我重置了 shell 并重新放入所有内容,它就可以工作了。
    • @selftaught91:这并不能告诉我太多,如果你不告诉我你尝试了什么以及发生了什么,我无法帮助你。
    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2011-06-02
    • 2011-02-27
    • 2012-08-14
    相关资源
    最近更新 更多