您的“关注”和“点赞”,是信任,是认可,是支持,是动力…
如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。
文章目录
1 类中的变量分类介绍
类体中的属性,指的就是类中的变量。
在类体中,根据变量定义的位置不同,以及定义的方式不同,类中的属性可细分为以下三种类型,如下所示:
- 类体中,所有函数之外:此范围定义的变量,称为
类属性或类变量
; - 类体中,所以函数内部:以“
self.变量名
”的方式定义的变量,称为实例属性或实例变量
; - 类体中,所有函数内部:以“
变量名 = 变量值
”的方式定义的变量,称为局部变量
。
2 类变量(类属性)
2.1 类变量(类属性)概述
类变量指的是类体中、所有函数之外定义的变量。
举例如下所示:
class User:
# 定义类变量
name = '码农阿杰' # 类变量 name
age = 28 # 类变量 age
# 实例方法
def add_id(self, user_id):
print('添加用户id的实例方法')
2.2 类变量(类属性)的特点
类变量会被所有类的实例化对象都同时共享。
类变量的调用方式有两种,如下所示,
(1)使用类的实例化对象调用类变量。
- 通过类对象可以调用所属类中的类变量。此方式不建议使用,因为如果实例变量和类变量同名时,使用类对象将无法调用类变量,它会首选实例变量(实例变量在第 3 小节会介绍。举例也在第 3 小节)。
- 注意:通过类对象是无法修改类变量的。通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量。
(2)使用类名直接调用类变量。
- 通过类名不仅可以调用所属类中的类变量,而且可以修改它的值。
- 通过类名访问类变量之外,还可以动态的为类和对象添加类变量。
- 注意:因为类变量会被所有类的实例化对象都同时共享,所以,通过类名修改类变量的值,会影响所有的实例化对象。
举例如下所示:
例一,(1)使用类的实例化对象调用。
class User:
# 定义类变量
name = '码农阿杰'
age = 28
# 实例方法
def add_id(self, user_id):
print('添加用户id的实例方法')
# (1)使用类的实例化对象调用类变量。
user = User() # 类的实例化(创建 User 类的对象)
print('修改前 类变量 name =', user.name)
print('修改前 类变量 age =', user.age)
print('------------------------------')
# 修改类变量的值
user.name = '阿杰'
user.age = 18
print('修改后 类变量 name =', User.name)
print('修改后 类变量 age =', User.age)
print('------------------------------')
# 通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量
print('通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量')
print('修改后 类变量 name =', user.name)
print('修改后 类变量 age =', user.age)
运行结果:
修改前 类变量 name = 码农阿杰
修改前 类变量 age = 28
------------------------------
修改后 类变量 name = 码农阿杰
修改后 类变量 age = 28
------------------------------
通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量
修改后 类变量 name = 阿杰
修改后 类变量 age = 18
例二,(2)使用类名直接调用。
class User:
# 定义类变量
name = '码农阿杰'
age = 28
# 实例方法
def add_id(self, user_id):
print('添加用户id的实例方法')
# (2)使用类名直接调用。
print('修改前 类变量 name =', User.name)
print('修改前 类变量 age =', User.age)
print('------------------------------')
# 修改类变量的值
User.name = '阿杰'
User.age = 18
print('修改后 类变量 name =', User.name)
print('修改后 类变量 age =', User.age)
print('------------------------------')
# 动态的为类和对象添加类变量 gender
User.gender = '男'
print('动态的为类和对象添加类变量 gender =', User().gender)
运行结果:
修改前 类变量 name = 码农阿杰
修改前 类变量 age = 28
------------------------------
修改后 类变量 name = 阿杰
修改后 类变量 age = 18
------------------------------
动态的为类和对象添加类变量 gender = 男
3 实例变量(实例属性)
3.1 实例变量(实例属性)概述
在任意类方法(构造方法或实例方法)内部以“self.变量名
”的方式定义的变量,叫做实例变量(或实例属性)。
举例如下所示:
class User:
# 构造方法
def __init__(self):
self.name = '码农阿杰' # 实例变量 name
self.age = 28 # 实例变量 age
# 实例方法
def add_id(self):
self.user_id = 1 # 实例变量 user_id
3.2 实例变量(实例属性)的特点
- 实例变量只作用于调用方法的对象。
- 实例变量只能通过对象名访问,无法通过类名访问。
- 如果实例变量和类变量同名,使用类对象将无法调用类变量,它会首选实例变量,这也是不推荐“类变量使用对象名调用”的原因。
- 注意:和类变量不同的是,通过某个对象修改实例变量的值,不会影响类的其它实例化对象,更不会影响同名的类变量。
举例如下所示:
例一,实例变量只作用于调用方法的对象。
class User:
# 构造方法
def __init__(self):
self.name = '码农阿杰'
self.age = 28
# 实例方法
def add_id(self):
self.user_id = 1
user = User() # 类的实例化(创建 User 类的对象)
# 由于 __init__(self) 构造方法是在创建类对象时自动调用,所以 User 类的类对象都会包含 name 和 age 实例变量
print(user.name)
print(user.age)
# 由于 user_id 实例变量在 add_id(self) 实例方法体中,如果 add_id(self) 实例方法没有被调用,那么 User 类的类对象中是不包含 user_id 实例变量的
print(user.user_id)
运行结果:
码农阿杰
28
Traceback (most recent call last):
File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 162, in <module>
print(user.user_id)
AttributeError: 'User' object has no attribute 'user_id'
例二,实例变量只能通过对象名访问,无法通过类名访问。
class User:
# 构造方法
def __init__(self):
self.name = '码农阿杰'
self.age = 28
# 实例方法
def add_id(self):
self.user_id = 1
user = User() # 类的实例化(创建 User 类的对象)
print('使用对象名访问实例变量 name = ', user.name) # 实例变量只能通过对象名访问
print('使用类名访问实例变量 name = ', User.name) # 实例变量无法通过类名访问。
运行结果:
使用对象名访问实例变量 name = 码农阿杰
Traceback (most recent call last):
File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 158, in <module>
print('使用类名访问实例变量 name = ', User.name)
AttributeError: type object 'User' has no attribute 'name'
例三,
class User:
# 定义类变量
name = '阿杰'
age = 18
# 构造方法
def __init__(self):
self.name = '码农阿杰'
self.age = 28
# 实例方法
def add_id(self):
self.user_id = 1
user = User() # 类的实例化(创建 User 类的对象)
# 如果实例变量和类变量同名,使用类对象将无法调用类变量,它会首选实例变量,
# 这也是不推荐“类变量使用对象名调用”的原因。
print('如果类变量和实例变量同名,通过类对象访问类变量 name = ', user.name)
print('如果类变量和实例变量同名,通过类对象访问类变量 age = ', user.age)
运行结果:
如果类变量和实例变量同名,通过类对象访问类变量 name = 码农阿杰
如果类变量和实例变量同名,通过类对象访问类变量 age = 28
4 局部变量
4.1 局部变量概述
类方法中直接以 “变量名 = 值
” 的方式进行定义的变量,叫做局部变量。
举例如下所示:
class User:
# 实例方法
def user_info(self):
name = '码农阿杰' # 局部变量 name
age = 28 # 局部变量 age
print(name, age)
4.2 局部变量的特点
局部变量只能用于所在函数中,函数执行完成后,局部变量也会被销毁。
举例如下所示:
class User:
# 实例方法
def user_info(self):
name = '码农阿杰' # 局部变量 name
age = 28 # 局部变量 age
print(name, age)
user = User()
user.user_info() # 执行 user_info() 方法,输出结果,该方法执行完毕
# 局部变量 name 和 age ,只能用于所在方法中,方法执行完毕后,局部变量也会被销毁。
print(user.name)
print(user.age)
运行结果:
码农阿杰 28
Traceback (most recent call last):
File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 156, in <module>
print(user.name)
AttributeError: 'User' object has no attribute 'name'