|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
动手环节里的请利用 __bases__ 属性,获取一个类的 MRO 顺序,
源代码为:
def get_bases(cls, count=0):
# 利用count记录递归级数
for i in range(count):
print("-", end=" ")
print(cls)
if cls.__bases__[0] is not object:
for each in cls.__bases__:
count += 1
get_bases(each, count)
count -= 1
假设类D继承自类A、B、C,类A、B、C都继承自类str
使用 __bases__ 属性获得的是这样的形式(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>),进行循环的时候,会出现each是<class '__main__.A'>的情况,当传入的参数是<class '__main__.A'>时,<class '__main__.A'>.__bases__无法显示它的父类。
只有<class '__main__.A'>等价于类A,该循环才能正常进行,这是否说明在python中<class '__main__.A'>等于类A呢?
在Python中,<class '__main__.A'>和类A并不完全等价。<class '__main__.A'>是指向类A的类型对象的引用,它本身也是一个对象,而类A则是这个类型对象创建出来的实例对象。
在使用__bases__属性获取类的父类时,返回的是一个元组,其中的每个元素都是一个类型对象的引用。在该循环中,每次迭代都会传递一个类型对象的引用,并尝试使用__bases__属性获取其父类,如果该类型是最顶层的基类object,那么__bases__属性将返回一个空元组,否则将返回一个包含所有父类类型对象的元组。
在循环中使用each.__bases__获取每个类的父类,其中each是一个类型对象的引用,所以<class '__main__.A'>.__bases__无法获取到它的父类。要获取类A的父类,可以使用类A本身,如A.__bases__。
因此,<class '__main__.A'>和类A并不完全等价,但可以通过A.__class__获得类A对应的类型对象的引用,从而在循环中正确获取到其父类。
|
|