【李刚-21天通关Python-28】之 类变量和实例变量
一、类变量与实例变量
- 类变量:在类空间或者通过类引用赋值的变量
- 实例变量:通过对象引用或self引用赋值的变量
class User:
# 类空间中定义的变量是类变量
category = "未知类型"
def __init__ (self, name='admin', password='password'):
# 通过self引用赋值的变量是实例变量
self.name = name
self.password = password
# 通过类引用赋值的变量是类变量
User.type = "通用用户"
二、类、对象可以访问类变量
- 通过类,可获取、修改类变量的值
- 通过对象,可获取变量的值
- 如果尝试通过对象对类变量赋值,就变成了新增实例变量
print(User.category) # 未知类型
User.category = "改变后的类型"
print(User.category) # 改变后的类型
us = User()
print(us.category) # 改变后的类型
# 当对象已有category实例变量时,对象本身优先访问实例变量
us.category = "实例类型"
print(us.category) # 实例类型
print(us.category) # 改变后的类型
三、类不能访问实例变量
- 实例变量不在类空间下,所以类不能访问实例变量
四、使用property合成属性
- 使用property合成属性(相当于实例变量):
- property(fget=None, fset=None, fdel=None, doc=None)
- 使用 property() 函数定义属性时也可以根据需要只传入少量参数(如合成只读属性就无需设置fget参数)
class Rectangle:
def __init__ (self, width, height):
self.width = width
self.height = height
def getarea (self):
print('getarea方法')
return self.width * self.height
# 合成了一个计算面积的属性
area = property(fget=getarea, doc="获取面积的属性")
def getsize(self):
print('getsize方法')
return self.width, self.height
def setsize (self, size):
print('setsize方法')
self.width = size[0]
self.height = size[1]
# 合成了一代表大小的属性
size = property(fget=getsize, fset=setsize, doc="代表大小的属性")
r = Rectangle(30, 40)
# 访问area属性(调用getter方法)
print(r.area)
# getarea
# 1200
# 访问size属性(调用getter方法)
print(r.size)
# getsize方法
# (30, 40)
# 对size属性赋值(调用setter方法)
r.size = (5, 6)
# setsize方法
print(r.area)
# getarea
# 30
五、使用@property装饰器
- 可使用@property装饰器来修饰getter方法,使之成为属性
- 如果需要为属性配备setter方法,则用 @属性名.setter 装饰器修饰setter方法
class Rectangle:
def __init__ (self, width, height):
self.width = width
self.height = height
@property
def area (self):
print('getarea方法')
return self.width * self.height
@property
def size(self):
print('getsize方法')
return self.width, self.height
@size.setter
def size (self, size):
print('setsize方法')
self.width = size[0]
self.height = size[1]
r = Rectangle(30, 40)
# 访问area属性(调用getter方法)
print(r.area)
# getarea
# 1200
# 访问size属性(调用getter方法)
print(r.size)
# getsize方法
# (30, 40)
# 对size属性赋值(调用setter方法)
r.size = (5, 6)
# setsize方法
print(r.area)
# getarea
# 30