python基础——property函数和@property装饰器

一、property函数

参考:内置函数——python3.8.1文档
在python中,私有属性是不能被外界访问的,但是这并不是绝对的,可以通过property函数间接的访问私有属性,并对私有属性进行修改,并且在修改之前也可以做一些相应的操作,来控制有哪些符合条件的可以对这个私有属性进行修改,同时,property函数可以将一个类中的方法当做一个对象属性一样来使用

语法property(fget=None, fget=None, fdel=None, doc=None)

参数:
fget获取属性值的函数
fset设置属性值的函数
fdel删除属性值的函数
doc文档说明

不使用property函数时,需要获取或设置私有属性值时,需要频繁的调用自定义函数
class A:
	def __init__(self, name):
		self.__age = None  # 私有属性,不能直接访问
		self.name = name
	
	def get_age(self):
		return self.__age

	def set_age(self, age):
		self.__age = age

	def del_age(self):
		del self.__age

xiaogu = A("xiaogu")
print(xiaogu.get_age())  # 通过自定义函数间接访问私有属性
xiaogu.set_age(18)  # 调用自定义函数设置私有属性值
print(xiaogu.get_age())  # 可以查看是否设置成功
xiaogu.del_age()  # 删除私有属性值
使用property函数,需要定义三个不同名函数
class A:
	def __init__(self, name):
		self.__age = None  # 私有属性,不能直接访问
		self.name = name
	
	def get_age(self):
		return self.__age

	def set_age(self, age):
		self.__age = age

	def del_age(self):
		del self.__age

	age = property(get_age, set_age, del_age)

xiaogu = A("xiaogu")
print(xiaogu.age)  # 默认会去找get_age 函数
xiaogu.age = 18  # 默认会去找set_age函数
print(xiaogu.age)  # 查看是否设置成功
del xiaogu.age  # 默认会去找del_age 函数
print(xiaogu.age)  # 会报值错误
使用@property装饰器,定义三个同名函数,同时对设置和删除私有属性值加上条件

定义age函数,其他使用的都是age同名函数,如果只有@property,没有age.setter和age.deleter,说明age是一个只读函数,不能修改和删除

class A:
	def __init__(self, name):
		self.name = name
		self.__age = None
	
	@property  # 只能是get方法,否则报错
	def age(self):
		return self.__age

	@age.setter
	def age(self, age):
		if 0 < age < 100:
			self.__age = age
		else:
			raise VauleError("age error")
		
	@age.deleter
	def age(self):
		if self.name == "xiaogu":
			del self.__age
		else:
			raise PermissionError("permission error")

xiaogu = A("xiaogu")
print(xiaogu.age)
xiaogu.age = 18
print(xiaogu.age)
del xiaogu.age
print(xiaogu.age)  # AttributeError: 'A' object has no attribute '_A__age'
发布了37 篇原创文章 · 获赞 2 · 访问量 949

猜你喜欢

转载自blog.csdn.net/zzrs_xssh/article/details/103748461