下面是《从零学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.manufacture
和robot2.manufacture
访问的是实例属性,因为实例属性的优先级比类属性高,所以输出"XYZ"。
好了,以上就是《从零学Python之引用和类属性的初步理解》的完整攻略,希望对你有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从零学Python之引用和类属性的初步理解 - Python技术站