python3 : 类变量和实例变量的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39377418/article/details/99339609

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

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

猜你喜欢

转载自blog.csdn.net/qq_39377418/article/details/99339609
今日推荐