python - 继承和实例
问题描述
我刚刚注意到
isinstance(myob, MyClass)
不仅返回True
whenmyob
是 的实例,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__)
有没有更直接的方法?
解决方案
这种传递行为是它应该如何直观地工作......
>>> 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 Book
和is-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,)
推荐阅读
- python - 从 2 个字符串列表中获取一个列表
- c# - 有什么方法可以在 c# winform in-project SQL Server 中插入中文吗?
- c++ - 使用函数指针为模板类指定推导指南
- python - 寻找 python 脚本将文件夹移动到具有相似名称的文件夹中
- python - 如何在 manim 中播放具有交错开始时间的动画
- python - 列表中的 Altair 注释
- javascript - 使用 JS 的 div 切换未按预期工作
- javascript - 使用 Lambda 处理多个 JSON 请求
- mongodb - 启动 mongo 守护程序时出现此错误,它说我没有创建 /data/db 目录,但创建了一个并将其设置为 db 路径
- r - 分箱颜色:格式化图例框架、标签和颜色