乐趣区

关于python:Python面向对象-类属性二

传送门:Python 类属性一

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

在 python 中属性的获取存在一个向上查找的机制。
向上查找始终找不到会报错。

  

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

利用 对象. 类属性 输入总数后果:
 

class Tool(object):
    # 应用赋值语句定义类属性,记录所有工具对象的数量
    # 初始数量是 0
    count = 0

    def __init__(self, name):
        self.name = name
        # 每减少一个工具对象,让类属性的值加 1
        Tool.count += 1


# 1. 创立工具对象
tool1 = Tool("扳手")
tool2 = Tool("老虎钳")
tool3 = Tool("斧头")

# 2. 输入工具对象的总数
# print(Tool.count)
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 种形式:

  • 类名. 类属性
  • 对象. 类属性(不举荐)

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

代码:

class Tool(object):
    # 应用赋值语句定义类属性,记录所有工具对象的数量
    # 初始数量是 0
    count = 0

    def __init__(self, name):
        self.name = name
        # 每减少一个工具对象,让类属性的值加 1
        Tool.count += 1


# 1. 创立工具对象
tool1 = Tool("扳手")
tool2 = Tool("老虎钳")
tool3 = Tool("斧头")

# 2. 输入工具对象的总数
tool1.count = 100
print("工具对象总数 %d" % tool1.count)
print("类中类属性的值 ====> %d" % Tool.count)

执行后果:误导后果是 100

执行过程:

文字说明:

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

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

更多相干 Python 教程能够移步去 Python 自学网 (www.wakey.com.cn/)从根底入门收费课程开始,逐渐深刻学习 python 全栈体系课程,适宜新手入门到精通全栈开发。

退出移动版