Python property、setter、deleter
面向对象封装特点之一就是通过实现好的方法来访问,限制对数据的不合理访问,把对象状态私有化,仅供类的内部进行操作
下方示例,Test方法的number属性类实例的时候传递1,number是一个公开属性,可以在外部任意修改、访问,没有对属性进行进行约束
class Test:
def __init__(self,number)
self.number = number
if __name__ == '__main__':
test = Test(1)
print(test.number)
test.number = -100
print(test.number)
@property
@property的作用是声明一个只读属性,在函数上装饰,像调用属性一样的去调用这个函数,对象.属性的方式操作,内部可以做一些逻辑判断,需要注意的两点
- 调用被装饰方法的时候不+括号
- 方法定义有且只能有self一个参数
class Test:
def __init__(self, number):
self.__number = number
@property # 声明number属性,只读
def number(self):
if self.__number >= 100:
raise ValueError('范围超出100')
return self.__number
if __name__ == '__main__':
test = Test(3)
print(test.number) # 3
@func.setter
setter就是给@property声明的属性设置值,func是当前函数的名字,但是当前函数setter,又需要指向property,所以property声明的函数名 和 setter的函数名需要一致,根据赋值操作还是获取操作决定走哪个方法
class Test:
def __init__(self,number):
self.__number = None
@property # 声明属性
def number(self):
if self.__number >= 100:
raise ValueError('范围超出100')
return self.__number
@number.setter # 设置属性
def number(self,number)
self.__number = number
'''
声明和设置属性的函数名字可以完全自定义,但是要与初始化变量名做区分,如果都一样的话会出现同名递归报错
'''
test = Test()
test.number = 30 # setter 设置值
print(test.number) #property声明的number获取值
@func.deleter
deleter装饰器见名知意,就是属性的删除操作,实际开发过程中,具体实现的逻辑由我们自己实现,当del属性的时候,会触发该装饰器函数内的流程,但是是否是删除操作,根据业务场景来实现
class Test:
def __init__(self):
self.__number = None
@property
def number(self):
return self.__number
@number.setter
def number(self, number):
self.__number = number
@number.deleter
def number(self):
self.__number = 100
if __name__ == '__main__':
test = Test()
test.number = 10
print(test.number) # 10
del test.number
print(test.number) # 100
'''
该示例中,deleter的方法中将number设置为了100,
del test.number后触发该流程,所以在deleter做什么事情,由自己决定,
可以是 del self.__number 也可有是self.__number=None等等,del只是触发条件
'''
property(fget,fset)
除了上面使用装饰器声明,还可有在类中设置属性指向property()对象,设置set和get的方法以及del方法
class Test:
def __init__(self):
self.__number = None
def get_number(self):
return self.__number
def set_number(self, number):
self.__number = number
def del_number(self):
del self.__number
# 设置number属性指向property对象
# fget 获取的时候触发的方法
# fset 赋值的时候触发的方法
# fdel 删除的时候触发的方法
number = property(fget=get_number, fset=set_number, fdel=del_number)
if __name__ == '__main__':
test = Test()
test.number = 100
print(test.number)
del test.number
Python property、setter、deleter的更多相关文章
- python基础-abstractmethod、__属性、property、setter、deleter、classmethod、staticmethod
python基础-abstractmethod.__属性.property.setter.deleter.classmethod.staticmethod
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- 封装,封装的原理,Property ,setter ,deleter,多态,内置函数 ,__str__ , __del__,反射,动态导入模块
1,封装 ## 什么是封装 what 对外隐藏内部的属性,以及实现细节,并给外部提供使用的接口 学习封装的目的:就是为了能够限制外界对内部数据的方法 注意 :封装有隐藏的意思,但不是单纯的隐藏 pyt ...
- 【python】面向对象编程之@property、@setter、@getter、@deleter用法
@property装饰器作用:把一个方法变成属性调用 使用@property可以实现将类方法转换为只读属性,同时可以自定义setter.getter.deleter方法 @property&@ ...
- 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter
上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一. 案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...
- python使用@property @x.setter @x.deleter
@property可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/deleter也是需要的. 1>只有@property表示只读. 2>同时 ...
- Lombok的@Data、@Setter、@Getter注解没反应问题解决
在用@Data注解时,没有生成setter/getter方法.百度了一堆都没解决方法,后来用Google查了一下解决了~~~ 使用IDEA需要安装Lombok插件,我这里已经下载好,如果没下载安装点击 ...
- OC中实例变量可见度、setter、getter方法和自定义初始化方法
在对类和对象有一定了解之后,我们进一步探讨实例变量的可见度等相关知识 实例变量的可见度分为三种情况:public(共有),protected(受保护的,默认),private(私有的),具体的不同和特 ...
- 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...
- 第7章 Python类型、类、协议目录
第7.1节 面向对象程序设计的相关知识 第7.2节 关于面向对象设计的一些思考 第7.3节 Python特色的面向对象设计:协议.多态及鸭子类型 第7.4节 Python中与众不同的类 第7.5节 揭 ...
随机推荐
- 【Docker】Postgres 安装
1.docker pull postgres 2.docker run --name postgres -v /home/postgre/data:/var/lib/postgresql/data - ...
- 4、jmeter的断言技术
断言:从反馈的结果来个需求匹配,是不是想要的内容 注:断言必要的时候才用 用过了会影响速度 1.操作步骤: 去选择自己想要响应的文本或者代码或者信息等等..... 2.断言相应大小的字节 3.断言响 ...
- 什么是 SpringMvc
SpringMvc 是 spring 的一个模块,基于 MVC 的一个框架,无需中间整合层来整合
- subplots函数使用说明
1.函数的功能 创建一个画布对象和一组子图对象. 2.函数的声明 fig, axs = subplots(nrows=1, ncols=1, sharex=False, sharey=False, s ...
- I - Cloud Retainer's Game
I - Cloud Retainer's Game 传送门: I. Cloud Retainer's Game (codeforces.com) 题意: 在坐标轴上有2个边界:y=0和y=H.有n个质 ...
- 实验2:Open vSwitch虚拟交换机实践(补实验一作业链接)
实验1:SDN拓扑实践 实验2:Open vSwitch虚拟交换机实践 一.实验目的 能够对Open vSwitch进行基本操作: 能够通过命令行终端使用OVS命令操作Open vSwitch交换机, ...
- linux使用iperf3测试带宽
1. https://www.alibabacloud.com/help/zh/express-connect/latest/test-the-performance-of-an-express-co ...
- vue中的观察者模式和发布订阅者模式
观察者模式 目标者对象和观察者对象有相互依赖的关系,观察者对某个对象的状态进行观察,如果对象的状态发生改变,就会通知所有依赖这个对象的观察者, 目标者对象 Subject,拥有方法:添加 / 删除 / ...
- Docker安装:Centos7.6安装Docker
Docker03:Centos7.6安装Docker 前提条件 内核版本 更新yum 包 卸载旧版本(如果安装过旧版本的话) 安装依赖包 设置yum源(阿里云源) 更新缓存 安装容器 启动并加入开机启 ...
- Unity打Android包报错总结 长期更新
报错1 Failed to compile resources with the following parameters: -bootclasspath "E:\software\And ...