继承和 isinstance

Mat*_*a G 0 python oop inheritance

我刚刚注意到

isinstance(myob, MyClass) 
Run Code Online (Sandbox Code Playgroud)

不仅返回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
Run Code Online (Sandbox Code Playgroud)

实例化Novel时如下:

novel = Novel('hardcover', 'police')
Run Code Online (Sandbox Code Playgroud)

然后

print(isinstance(novel, Book))
Run Code Online (Sandbox Code Playgroud)

print (isinstance(novel , Novel))
Run Code Online (Sandbox Code Playgroud)

两者都打印True.

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

另外,与此相关:

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

print(novel.__class__.__bases__)
Run Code Online (Sandbox Code Playgroud)

有更直接的方法吗?

tim*_*geb 6

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

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

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

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

>>> Novel.__bases__
>>> (__main__.Book,)
Run Code Online (Sandbox Code Playgroud)