首页 > 解决方案 > 继承和实例

问题描述

我刚刚注意到

isinstance(myob, MyClass) 

不仅返回Truewhenmyob是 的实例,MyClass而且返回 ifmyob是继承自 的类的实例MyClass

为了更清楚,请考虑以下几点:

class Book(object):
    def __init__(self, cover)
        self._cover = cover

class Novel(Book):
    def __init__(self, cover, category):
        Book.__init__(self, cover)
        self._category = category

如下实例化 Novel 时:

novel = Novel('hardcover', 'police')

然后

print(isinstance(novel, Book))

print (isinstance(novel , Novel))

都打印True

为什么呢?在我的意义上,novel是一个Novel实例,而不是Book一个......

此外,与此相关:

为了获得“祖母”(原文如此)课程,我这样做:

print(novel.__class__.__bases__)

有没有更直接的方法?

标签: pythonoopinheritance

解决方案


这种传递行为是它应该如何直观地工作......

>>> class Text:
...:    pass
...:
...:
>>> class Book(Text):
...:    pass
...:
...:
>>> class Novel(Book):
...:    pass
...:
...:
>>> n = Novel()
>>> isinstance(n, Novel)
>>> True
>>> isinstance(n, Book)
>>> True
>>> isinstance(n, Text)
>>> True

...因为 a Novel is-a Novel,但也是is-a Bookis-a Text

如果你想知道一个类(或类的实例)是否是另一个类的直接祖先,可以使用__subclasses__类对象的方法。

>>> Text.__subclasses__()
>>> [__main__.Book]
>>> Book.__subclasses__()
>>> [__main__.Novel]
>>> Novel.__subclasses__()
>>> []
>>> 
>>> Novel in Text.__subclasses__()
>>> False
>>> type(n) in Text.__subclasses__()
>>> False
>>> Novel in Book.__subclasses__()
>>> True
>>> type(n) in Book.__subclasses__()
>>> True

编辑:YourClass.__bases__还为您提供所有直接父类。

>>> Novel.__bases__
>>> (__main__.Book,)

推荐阅读