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)
有更直接的方法吗?
这种传递行为直观地应该如何工作......
>>> 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 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
Run Code Online (Sandbox Code Playgroud)
编辑:YourClass.__bases__还为您提供所有直接父类。
>>> Novel.__bases__
>>> (__main__.Book,)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6321 次 |
| 最近记录: |