一、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'