从零学Python之引用和类属性的初步理解

下面是《从零学Python之引用和类属性的初步理解》的完整攻略:

下面是《从零学Python之引用和类属性的初步理解》的完整攻略:

一、引用

在Python中,变量赋值时会创建一个对象并将变量名指向该对象,这个过程就是变量引用。

1. 可变对象和不可变对象

Python中有可变对象和不可变对象两个概念。其中,不可变对象包括数字、字符串、元组等;可变对象包括列表、字典等。当一个不可变类型的对象被赋给另外一个变量时,实际上是创建了一个新的对象,并把变量名指向这个新的对象。而对于可变对象,则是将变量名指向原来的对象。

示例一:

a = 1  # a指向一个整数对象1
b = a  # b也指向这个整数对象1
a += 1 # a被重新赋值,指向一个新的整数对象2
print(a, b) # 输出2, 1

示例二:

list1 = [1, 2, 3]  # list1指向一个列表对象
list2 = list1  # list2也指向这个列表对象
list1[0] = 0  # 修改列表的第一个元素
print(list1, list2) # 输出[0, 2, 3], [0, 2, 3]

2. 可变对象作为函数参数

在函数中传递可变对象作为参数,如果在函数中修改该可变对象,会影响到该对象在函数外的值。

示例三:

def change_list(lst):
    lst[0] = 0   # 修改列表的第一个元素

list1 = [1, 2, 3]  # 定义一个列表
change_list(list1)  # 通过函数修改列表的值
print(list1)   # 输出[0, 2, 3],因为函数内部修改了列表

二、类属性

类属性是类中定义的属性,可以通过类名直接访问,也可以通过类的实例访问。类属性的值相同,对任何一个实例的访问都将返回相同的结果。

示例四:

class Robot:
    manufacture = "MAKERBOT" # 声明类属性

robot1 = Robot() # 创建Robot的实例
robot2 = Robot() # 再次创建Robot的实例

print(Robot.manufacture) # 通过类名直接访问类属性
print(robot1.manufacture) # 通过实例访问类属性
print(robot2.manufacture) # 通过实例访问类属性

以上代码的输出分别为:

MAKERBOT
MAKERBOT
MAKERBOT

1. 修改类属性的值

可以使用“类名.属性名”或“实例名.属性名”对类属性进行修改,修改后每个实例的属性值都将被更改。

示例五:

class Robot:
    manufacture = "MAKERBOT" # 声明类属性

robot1 = Robot() # 创建Robot的实例
robot2 = Robot() # 再次创建Robot的实例

Robot.manufacture = "XYZ" # 修改类属性

print(Robot.manufacture, robot1.manufacture, robot2.manufacture)
# 输出"XYZ, XYZ, XYZ"

2. 实例属性和类属性的区别

实例属性和类属性是不同的。实例属性是每个实例独有的属性,而类属性是所有实例共享的属性。当实例和类同时具有同名属性时,实例属性的优先级更高,类属性会被屏蔽。

示例六:

class Robot:
    manufacture = "MAKERBOT" # 声明类属性

    def __init__(self):
        self.manufacture = "XYZ" # 定义一个实例属性

robot1 = Robot() # 创建Robot的实例
robot2 = Robot() # 再次创建Robot的实例

print(Robot.manufacture, robot1.manufacture, robot2.manufacture) 
# 输出"MAKERBOT, XYZ, XYZ"

以上代码的输出为:

MAKERBOT XYZ XYZ

在第一个print语句中,Robot.manufacture访问的是类属性,因此输出"MAKERBOT"。robot1.manufacturerobot2.manufacture访问的是实例属性,因为实例属性的优先级比类属性高,所以输出"XYZ"。

好了,以上就是《从零学Python之引用和类属性的初步理解》的完整攻略,希望对你有所帮助!

本文标题为:从零学Python之引用和类属性的初步理解

基础教程推荐