学习Python时的感受,希望大家一起讨论,不对的地方请大家指正。
在调用Python 类中的属性时,按照一定的顺序查找调用的属性:先在当前的实列中找,如果当前实列有,就使用当前实列中的属性值,如果没有就查找抽象类中的属性值。
class Ct3:
ct = 0 # 抽象类属性, 类变量 ct = 0
a = Ct3() # 实例化类a, 类变量 a.ct = 0
b = Ct3() # 实例化类b, 类变量 b.ct = 0
c = Ct3() # 实例化类c, 类变量 c.ct = 0
print(a.ct, b.ct, c.ct) # 1 输出 类变量: 0, 0, 0
a.ct += 10 # 实例化类a调用实列类变量 a.ct
print(a.ct, b.ct, c.ct) # 2 输出 : 10, 0, 0
Ct3.ct += 100 # 类Ct3类变量 Ct3.ct
print(a.ct, b.ct, c.ct) # 3 输出: 10, 100, 100
运行结果:
D:PycharmProjectstestvenvScriptspython.exe D:/PycharmProjects/test/t3.py
0 0 0
10 0 0
10 100 100
进程已结束,退出代码为 0
看到
# 1 输出 类变量:0, 0, 0 显然,实例化类a,b,c中的属性变量a.ct, b.ct, c.ct都没有赋过值,于是顺序查找到抽象类中的值0来使用。
# 2 输出 :10, 0, 0 实例化类a,b,c中的属性变量a.ct被调用赋值+10因此按照查找顺序实列本身中就有值10,所以就使用实列本身的值,b.ct, c.ct没有赋过值,于是顺序查找到抽象类中的值0来使用。 这时抽象类中的属性Ct3.ct被调用,执行Ct3.ct += 100操作,值Ct3.ct = 100,
# 3 输出:10, 100, 100实例化类a,b,c中的属性变量a.ct被调用赋值+10因此按照查找顺序实列本身中就有值10,所以就使用实列本身的值,b.ct, c.ct没有赋过值,于是顺序查找到抽象类中的值100来使用。
class Ct2:
ct = 0 # 抽象类属性, 类变量 ct = 0
a = Ct2() # 实例化类a, 类变量 a.ct = 0
b = Ct2() # 实例化类b, 类变量 b.ct = 0
c = Ct2() # 实例化类c, 类变量 c.ct = 0
print(a.ct, b.ct, c.ct) # 1 输出 类变量: 0, 0, 0
a.ct += 10 # 实例化类a调用实列类变量 a.ct
b.ct += 10 # 实例化类a调用实列类变量 b.ct
c.ct += 10 # 实例化类a调用实列类变量 c.ct
print(a.ct, b.ct, c.ct) # 2 输出 类变量: 10, 10, 10
Ct2.ct += 100
print(a.ct, b.ct, c.ct) # 3 输出 类变量: 10, 10, 10
运行结果:
D:PycharmProjectstestvenvScriptspython.exe D:/PycharmProjects/test/t2.py
0 0 0
10 10 10
10 10 10
进程已结束,退出代码为 0
看到
# 1 输出 类变量:0, 0, 0 显然,实例化类a,b,c中的属性变量a.ct, b.ct, c.ct都没有赋过值,于是顺序查找到抽象类中的值来使用。
# 2 输出 :10, 10, 10 实例化类a,b,c中的属性变量a.ct, b.ct, c.ct被调用赋值+10因此按照查找顺序实列本身中就有值10,所以就使用实列本身的值,不必顺序查找到抽象类中的值来使用。
# 3 输出:10, 10, 10实例化类a,b,c中的属性变量a.ct, b.ct, c.ct被调用赋值+10因此按照查找顺序实列本身中就有值10,所以就使用实列本身的值,不必顺序查找到抽象类中的值来使用。
class Ct:
ct = 0 # 抽象类属性, 类变量 ct = 0
Ct.ct += 100 # 抽象类中的值 Ct.ct = 100
a = Ct() # 实例化类a, 类变量 a.ct = 100
b = Ct() # 实例化类b, 类变量 b.ct = 100
c = Ct() # 实例化类c, 类变量 c.ct = 100
print(a.ct, b.ct, c.ct) # 1 输出 类变量:100, 100, 100
a.ct += 10
b.ct += 10
c.ct += 10
print(a.ct, b.ct, c.ct) # 2 输出 :110, 110, 110
Ct.ct += 100 # 抽象类中的值 Ct.ct = 200
print(a.ct, b.ct, c.ct) # 3 输出:110, 110, 110
运行结果:
D:PycharmProjectstestvenvScriptspython.exe D:/PycharmProjects/test/test.py
100 100 100
110 110 110
110 110 110
进程已结束,退出代码为 0
看到,首先调用抽象类对抽象类中的属性,类变量进行操作,使Ct.ct += 100,这时Ct.ct = 100
# 1 输出 类变量:100, 100, 100 显然,实例化类a,b,c中的属性变量a.ct, b.ct, c.ct都没有赋过值,于是顺序查找到抽象类中的值100来使用。
# 2 输出:110, 110, 110 实例化类a,b,c中的属性变量a.ct, b.ct, c.ct被调用赋值+10因此按照查找顺序实列本身中就有值110,所以就使用实列本身的值,不必顺序查找到抽象类中的值来使用。
然后再次对抽象类中的属性,类变量进行操作,使Ct.ct += 100,这时Ct.ct = 200
# 3 输出:110, 110, 110 实例化类a,b,c中的属性变量a.ct, b.ct, c.ct被调用赋值+10因此按照查找顺序实列本身中就有值110,所以就使用实列本身的值,不必顺序查找到抽象类中的值200来使用。
在实际使用时,通过使用实例对象名.属性名的方法来操作类属性,避免使用抽象类名.属性名的方法来操作类属性。



