版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
类变量又叫全局变量,是属于类的特性,实例先找实例化变量,然后再去找类变量 . 但是 实例变量只是属于 实例化的变量, 但是 类变量 也可以用实例去调用. 如果类变量有多重继承关系, 就需要按照指定的路线进行查找 . 先看看代码理解下吧
class A:
aa=10
def __init__(self,a,b):
self.a=a
self.b=b
a=A(5,20)
print(a.a) # 实例变量
print((a.aa)) # 实例读取类变量
# 输出
"""
5
10
"""
如果类去读取 实例变量看看,是否适用?
class A:
aa=10
def __init__(self,a,b):
self.a=a
self.b=b
a=A(5,20)
print(A.a)
# 抛出异常
"""
AttributeError: type object 'A' has no attribute 'a'
"""
说明 类变量是不能读取实例变量. 接下来看这个例子
class A:
aa=10
def __init__(self,a,b):
self.a=a
self.b=b
a=A(5,20)
print(a.aa)
a.aa=30
print(a.aa)
# 输出
"""
10
30
"""
看到这个结果是不是很奇怪, 来解释下 , 首先a.aa=30 意思是 在实例化添加一个属性 叫aa , value=30, 上边我已经说了 实例先找实例化变量,然后再去找类变量
接下来要学会的是 类和实例属性的查找顺序-MRO算法
1.菱形关系图
继承关系如图
我用代码模拟上边的图片的内容, 我再用方法打印走势,看看怎么读取的.
#输出如下:
class D:
pass
class B(D):
pass
class C(D):
pass
class A(B, C):
pass
a = A()
print(A.__mro__)
# 输出
"""
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>)
"""
这个时候走的路线就是 A>B>C>D>Object . 以后如果是菱形模式都是这样查找路线.
2.箭头关系图 还是用上边的**A.mro**方法查找,一定会得出BFS:A>B>C>D>E