栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python 类中属性,对抽象类变量与抽象类的实列变量操作的理解

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python 类中属性,对抽象类变量与抽象类的实列变量操作的理解

学习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来使用。

在实际使用时,通过使用实例对象名.属性名的方法来操作类属性,避免使用抽象类名.属性名的方法来操作类属性。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008361.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号