• Python面向对象 —— 类属性「二」(属性获取机制和陷阱、代码示例、执行流程分析)


    欢迎关注博主 python老鸟 或 前往 『Python自学网』, 从基础入门免费课程开始,逐步深入学习python全栈体系课程,适合新手入门到精通全栈开发。


    免费专栏传送门:《Python基础教程


    类属性(一)http://t.csdn.cn/8Uncg

    一、属性的获取机制(向上查找)

    在python中属性的获取存在一个向上查找的机制。

    向上查找一直找不到会报错。

    1.1 代码 + 画图 演示 查找执行过程:

    利用 对象.类属性 输出总数结果:

    1. class Tool(object):
    2. # 使用赋值语句定义类属性,记录所有工具对象的数量
    3. # 初始数量是0
    4. count = 0
    5. def __init__(self, name):
    6. self.name = name
    7. # 每增加一个工具对象,让类属性的值加1
    8. Tool.count += 1
    9. # 1. 创建工具对象
    10. tool1 = Tool("扳手")
    11. tool2 = Tool("老虎钳")
    12. tool3 = Tool("斧头")
    13. # 2. 输出工具对象的总数
    14. # print(Tool.count)
    15. print("工具对象总数 %d" % tool1.count)

    执行结果:

    注意:无论是tool1.count,还是tool2.count还是tool3.count结果都3

    图解:

    文字解释:

    Python的解释器在执行代码时是从上向下顺序执行的,当来到第一行发现是个类,此时并不会立即执行而是向下寻找可以执行的代码,第13行代码在内存中创建一个叫做扳手的工具,在工具对象中只会记录工具的名称name,同时在执行初始化方法的时候要修改方法中类属性的值(这个代码Tool.count =+ 1)所以count数值从0变成1。初始化方法完成,扳手这个工具对象在内存中也已经存在了,那么代码继续向下执行,在第14行又创建了一个老虎钳的工具,在执行初始化方法时,又会把count的数值加1,此时count数值变成2,初始化方法完成,代码继续向下执行到15行继续在内存中创建一个水桶的工机具,同时在执行初始化方法时会把count的数值加1,此时count数值变成3。

    关键时刻:

    此时执行19行代码,打印tool1的count属性,在打印tool1的count属性时Python解释器是这样执行的:

    首先Python解释器会在tool1的对象中来查找有没有count这个属性,如果有就直接输出,没有就会按照向上查找的方式来向上查找创建工具对象的类,在这个类中查找有没count这个类属性,如果找到就把类属性的值在控制台中输出。

    1.2 因此,要访问类属性有2种方式:

    1. 类名.类属性
    2. 对象.类属性(不推荐)

    二、对象.类属性 方式的陷阱:

    代码:

    1. class Tool(object):
    2. # 使用赋值语句定义类属性,记录所有工具对象的数量
    3. # 初始数量是0
    4. count = 0
    5. def __init__(self, name):
    6. self.name = name
    7. # 每增加一个工具对象,让类属性的值加1
    8. Tool.count += 1
    9. # 1. 创建工具对象
    10. tool1 = Tool("扳手")
    11. tool2 = Tool("老虎钳")
    12. tool3 = Tool("斧头")
    13. # 2. 输出工具对象的总数
    14. tool1.count = 100
    15. print("工具对象总数 %d" % tool1.count)
    16. print("类中类属性的值====> %d" % Tool.count)

    执行结果:误导结果是100

    执行过程:

    文字说明:

    首先从第一行一直执行到第15行的过程和上面一样,在执行到第18行时,使用赋值语句设置属性值,Python解释器在执行到这里的时候并不会向上面讲的一样向上查找类属性,而Python解释器在执行赋值语句的时候就会在扳手内存中来查找有没没有count属性,如果没有就会在对象中直接添加一个count属性,并且值为100,因此19行代码在执行的时候就会把count的属性值输出成100,第18行代码并没有修改到类属性,所以在20行代码的时候通过类名来访问类属性还是当时的数值3。

    注意:

    如果使用对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值。

     

  • 相关阅读:
    Day 21:C++STL算法篇(2/2)
    Arduino开发实例-MAX30100传感器模块连接问题解决
    IP应用场景查询API:深入了解网络用户行为的利器
    ssm基于JavaEE的电脑销售管理系统设计与实现毕业设计源码021143
    基于Java毕业设计药品管理系统源码+系统+mysql+lw文档+部署软件
    javaIO流01:文件,创建文件三种方式,获取文件相关信息,目录操作
    如何使用SQL工具批量执行SQL文件?(以MySQL和SQLynx为例)
    自研 MySQL Binlog 分析程序介绍
    三维模型3DTile格式轻量化在网络传输中的重要性分析
    常用日期类
  • 原文地址:https://blog.csdn.net/weixin_48728769/article/details/126873238