类变量和实例变量的区别

版权声明:转载 或者复制请标注来源 https://blog.csdn.net/qq_34979346/article/details/83181353

类变量又叫全局变量,是属于类的特性,实例先找实例化变量,然后再去找类变量. 但是 实例变量只是属于 实例化的变量, 但是 类变量 也可以用实例去调用. 如果类变量有多重继承关系, 就需要按照指定的路线进行查找. 先看看代码理解下吧

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

如果类去读取 实例变量看看,是否适用?

print(A.a) 
#抛错 
 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
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34979346/article/details/83181353