翼度科技»论坛 编程开发 python 查看内容

Python property、setter、deleter

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
面向对象封装特点之一就是通过实现好的方法来访问,限制对数据的不合理访问,把对象状态私有化,仅供类的内部进行操作
下方示例,Test方法的number属性类实例的时候传递1,number是一个公开属性,可以在外部任意修改、访问,没有对属性进行进行约束
  1. class Test:
  2.   def __init__(self,number)
  3.           self.number = number
  4. if __name__ == '__main__':
  5.   test = Test(1)
  6.   print(test.number)
  7.   test.number = -100
  8.   print(test.number)
复制代码
@property

@property的作用是声明一个只读属性,在函数上装饰,像调用属性一样的去调用这个函数,对象.属性的方式操作,内部可以做一些逻辑判断,需要注意的两点


  • 调用被装饰方法的时候不+括号
  • 方法定义有且只能有self一个参数
  1. class Test:
  2.     def __init__(self, number):
  3.         self.__number = number
  4.     @property  # 声明number属性,只读
  5.     def number(self):
  6.         if self.__number >= 100:
  7.             raise ValueError('范围超出100')
  8.         return self.__number
  9. if __name__ == '__main__':
  10.     test = Test(3)  
  11.     print(test.number)  # 3
复制代码
@func.setter

setter就是给@property声明的属性设置值,func是当前函数的名字,但是当前函数setter,又需要指向property,所以property声明的函数名 和 setter的函数名需要一致,根据赋值操作还是获取操作决定走哪个方法
  1. class Test:
  2.   def __init__(self,number):
  3.     self.__number = None
  4.    
  5.   @property # 声明属性
  6.   def number(self):
  7.     if self.__number >= 100:
  8.       raise ValueError('范围超出100')
  9.     return self.__number
  10.   
  11.   @number.setter # 设置属性
  12.   def number(self,number)
  13.                   self.__number = number
  14.    
  15. '''
  16. 声明和设置属性的函数名字可以完全自定义,但是要与初始化变量名做区分,如果都一样的话会出现同名递归报错
  17. '''
  18. test = Test()
  19. test.number = 30  # setter 设置值
  20. print(test.number) #property声明的number获取值
复制代码
@func.deleter

deleter装饰器见名知意,就是属性的删除操作,实际开发过程中,具体实现的逻辑由我们自己实现,当del属性的时候,会触发该装饰器函数内的流程,但是是否是删除操作,根据业务场景来实现
  1. class Test:
  2.     def __init__(self):
  3.         self.__number = None
  4.     @property
  5.     def number(self):
  6.         return self.__number
  7.     @number.setter
  8.     def number(self, number):
  9.         self.__number = number
  10.     @number.deleter
  11.     def number(self):
  12.         self.__number = 100
  13. if __name__ == '__main__':
  14.     test = Test()
  15.     test.number = 10
  16.     print(test.number)  # 10
  17.     del test.number
  18.     print(test.number)  # 100
  19. '''
  20. 该示例中,deleter的方法中将number设置为了100,
  21. del test.number后触发该流程,所以在deleter做什么事情,由自己决定,
  22. 可以是 del self.__number 也可有是self.__number=None等等,del只是触发条件
  23. '''
复制代码
property(fget,fset)

除了上面使用装饰器声明,还可有在类中设置属性指向property()对象,设置set和get的方法以及del方法
  1. class Test:
  2.     def __init__(self):
  3.         self.__number = None
  4.     def get_number(self):
  5.         return self.__number
  6.     def set_number(self, number):
  7.         self.__number = number
  8.     def del_number(self):
  9.         del self.__number
  10.     # 设置number属性指向property对象
  11.     # fget 获取的时候触发的方法
  12.     # fset 赋值的时候触发的方法
  13.     # fdel 删除的时候触发的方法
  14.     number = property(fget=get_number, fset=set_number, fdel=del_number)
  15. if __name__ == '__main__':
  16.     test = Test()
  17.     test.number = 100
  18.     print(test.number)
  19.     del test.number
复制代码
来源:https://www.cnblogs.com/Mickey-7/p/17306118.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具