Fre*_*est 2 python oop inheritance
反正有没有在Python中发现类的基类?
给定以下类定义:
class A:
def speak(self):
print "Hi"
class B(A):
def getName(self):
return "Bob"
Run Code Online (Sandbox Code Playgroud)
如果我收到一个对象的实例,我可以通过执行以下操作轻松地确定它是B:
instance = B()
print B.__class__.__name__
Run Code Online (Sandbox Code Playgroud)
其中按预期打印类名"B".
反正有没有发现对象的实例继承自基类以及实际的类?
或者这不是Python中的对象如何工作?
检查模块也非常强大:
>>> import inspect
>>> inst = B()
>>> inspect.getmro(inst.__class__)
(<class __main__.B at 0x012B42A0>, <class __main__.A at 0x012B4210>)
Run Code Online (Sandbox Code Playgroud)
b = B()
b.__class__
b.__class__.__base__
b.__class__.__bases__
b.__class__.__base__.__subclasses__()
Run Code Online (Sandbox Code Playgroud)
我强烈建议您查看ipython并使用标签完成:-)
获取类层次结构的另一种方法是访问mro属性:
class A(object):
pass
class B(A):
pass
instance = B()
print(instance.__class__.__mro__)
# (<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
Run Code Online (Sandbox Code Playgroud)
请注意,在 Python 2.x 中,您必须使用“新式”对象以确保它们具有 mro属性。你可以通过声明来做到这一点
class A(object):
Run Code Online (Sandbox Code Playgroud)
代替
class A():
Run Code Online (Sandbox Code Playgroud)
有关新样式对象和 mro(方法解析顺序)的更多信息,请参阅http://www.python.org/doc/newstyle/和http://www.python.org/download/releases/2.3/mro/ 。
在Python 3.x中,所有对象都是新式对象,因此您可以使用mro并简单地以这种方式声明对象:
class A():
Run Code Online (Sandbox Code Playgroud)