【李刚-21天通关Python-28】之 类变量和实例变量

【李刚-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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值