继承与实例

时间:2018-10-24 15:18:10

标签: python oop inheritance

我刚刚注意到

isinstance(myob, MyClass) 

不仅在Truemyob的实例时返回MyClass,而且在myob是从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('hardcover', 'police')

然后

print(isinstance(novel, Book))

print (isinstance(novel , Novel))

同时打印True

为什么会这样?在我看来,novel是一个Novel实例,而不是Book一个实例……

与此有关:

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

print(novel.__class__.__bases__)

还有更直接的方法吗?

2 个答案:

答案 0 :(得分:3)

继承是“是”关系-如果DuckBird继承,那么鸭子(Duck的实例)显然也是bird({{的实例) 1}}),因此您观察到的行为确实是预期的行为(这适用于所有基于类的OOPL)。

如果您要检查对象的 exact 类型,则可以使用Bird获取它-该对象将返回对象的类-并针对所需的类进行身份测试,即:

type(obj)

答案 1 :(得分:2)

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

>>> 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

...因为Novel is-a Novel,而且是- Book是- 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,)