我刚刚注意到
isinstance(myob, MyClass)
不仅在True
是myob
的实例时返回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__)
还有更直接的方法吗?
答案 0 :(得分:3)
继承是“是”关系-如果Duck
从Bird
继承,那么鸭子(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,)