property、setter、deleter装饰器的使用
property装饰器
python的@property是python的一种装饰器,是用来修饰方法的。
作用:
我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。
使用场景:
1.修饰方法,是方法可以像属性一样访问。
class DataSet(object):@propertydef method_with_property(self): ##含有@propertyreturn 15def method_without_property(self): ##不含@propertyreturn 15l = DataSet()
# 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
print(l.method_with_property)
#没有加@property , 必须使用正常的调用方法的形式,即在后面加()
print(l.method_without_property())
如果使用property进行修饰后,又在调用的时候,方法后面添加了(), 那么就会显示错误信息:TypeError: 'int' object is not callable,也就是说添加@property 后,这个方法就变成了一个属性,如果后面加入了(),那么就是当作函数来调用,而它却不是callable(可调用)的。
2.与所定义的属性配合使用,这样可以防止属性被修改。
由于python进行属性的定义时,没办法设置私有属性,因此要通过@property的方法来进行设置。这样可以隐藏属性名,让用户进行使用的时候无法随意修改。
class DataSet(object):def __init__(self):self._images = 1self._labels = 2 #定义属性的名称@propertydef images(self): #方法加入@property后,这个方法相当于一个属性,这个属性可以让用户进行使用,而且用户有没办法随意修改。return self._images@propertydef labels(self):return self._labels
l = DataSet()
#用户进行属性调用的时候,直接调用images即可,而不用知道属性名_images,因此用户无法更改属性,从而保护了类的属性。
print(l.images) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
setter装饰器
为了可以修改x,我们把x的值1写成实例属性self.num,
当然这个例子中外部也可以直接通过修改num的值来修改x的值,不过这个不要紧,因为只是为了方便理解,
实际使用中我们可以把self.num 写成私有属性,来保障不会被外部直接修改值,
写一个x属性同名方法,并且用x属性同名的setter装饰器(x.setter)来装饰同名方法x,然后在这个方法下实现对self.num的值的修改:
class Num:def __init__(self):self.num = 1@propertydef x(self):return self.num@x.setterdef x(self, item):self.num = item@propertydef y(self):return 2def printf(self):print(f'{self.x}加{self.y}的和是:{self.x+self.y}')a = Num() # 把C实例化,命名为a
a.x = 2
a.printf()
deleter装饰器
同setter装饰器,不再详细说明,不同的地方在于被deleter装饰的同名x方法不接收参数,因为我们只是删除了self.num,不需要接收参数:
class Num:def __init__(self):self.num = 1@propertydef x(self):return self.num@x.setterdef x(self, item):self.num = item@x.deleterdef x(self):del self.num@propertydef y(self):return 2def printf(self):print(f'{self.x}加{self.y}的和是:{self.x+self.y}')a = Num() # 把C实例化,命名为a
a.x = 2
a.printf()
del a.x
print(a.x)
deleter装饰器装饰的方法就可以被使用del 来删除对应的属性,删除属性的操作我们就再同名方法x中进行了实现,
这样外部删除属性的方法也和删除一个属性的方法保持一致,同样保证了高可用性和可读性。
总结
使用property装饰器装饰的方法可以被上层以调用属性的方式来调用,类本身也可以,可以理解为property属性,也是一个属性;
使用property属性同名.setter装饰器装饰的同名方法,提供property=xx 的方法;
使用property属性同名.deleter装饰器装饰的同名方法,提供del xx的方法。
另外,重要的一点是既然我们已经使用property来代替实例属性,那自然我们是不希望外层可以直接修改实例属性的,
既然如此我们就最好不能使用上述例子中使用的self.num的命名方式来定义实例属性,而是使用私有属性的方式来定义(关于私有属性的知识点可以查看文章开头的相关知识点):
class Num:def __init__(self):self.__num = 1@propertydef x(self):return self.__num@x.setterdef x(self, item):if isinstance(item, int):self.__num = itemelse:print('不要把非int类型赋值给x!!!')@x.deleterdef x(self):if self.__num:del self.__numelse:print('属性不存在')@propertydef y(self):return 2def printf(self):print(f'{self.x}加{self.y}的和是:{self.x+self.y}')a = Num() # 把C实例化,命名为a
a.x=2
a.printf()
a.__name = 3 # 不能直接访问私有属性,新建了一个属性
a.printf()
property、setter、deleter装饰器的使用相关推荐
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...
上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一. 案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...
- python装饰器 property_python @property装饰器
1.通过@property装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对"()"小括号. class Person: def __init__(self, name ...
- 初学者python笔记(类的装饰器、property方法、元类)
文章目录 上下文协议管理 类的装饰器基本原理 property方法的巧用 利用描述符自定制property property下的setter与deleter Python的元类 元类的概念 自定义元类 ...
- 浅析Python装饰器中的@property
点击上方"Go语言进阶学习",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 不堪玄鬓影,来对白头吟. 一.使用@prop ...
- python中的@property装饰器
引言 本文将要介绍Python中@property装饰器,这是一种python风格的getters和setters方法.Python编程为我们提供了一个内置的@property装饰器,它使面向对象编程 ...
- python内置装饰器property_Python中的内置装饰器之property
装饰器是Python中很重要的一个概念,但是这篇文档不介绍装饰器的实现,我们只需要知道装饰器可以实现一些功能: Python中也包含一些自带的装饰器,这次就说一下属性装饰器property 相关知识点 ...
- Python @property装饰器详解
之前的文章中,我们探究了@后接某个自定义函数的用法,实际上,更常见.完备.简单的应用在于对@和python内置的函数进行结合:这可以避免造轮子的行为. 我们知道, Python 内置了3种函数装饰器, ...
- python之装饰器初识
一.@abstractmethod 1.抽象类的作用:规范编程模式 多人开发.复杂的需求.后期的扩展 是一种用来帮助我们完成规范化的手段 2.如何定义抽象类 1,from abc import ABC ...
- python教程:类的装饰器方法、特殊成员方法
装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 1.静态方法 在方法名前加上@staticmethod装饰 ...
最新文章
- python批量导入MongoDB数据库
- 使用get set方法添减属性_头皮银屑病“克星”使用方法,你GET了吗?
- getSystemService
- 7-11 mmh学长的万能日历 (20分)
- 用webpack打包加密静态配置文件
- 安装制作 基础篇(一) 基本概念
- oracle 报表聚合,Oracle很实用的汇总报表实现方式!grouping_id
- mov文件如何转换成mp4?巧用嗨格式视频转换器
- 安装ansys时出现问题 MS.NET Framework would you like to retry?的解决办法:
- 领导力有哪些方面?什么是领导力?
- npm shrinkwrap
- 【早期笔记】java 开发环境搭建
- 机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)...
- 一日一签免费算卦_一日一签app免费算卦
- 计算机无法屏幕亮度,今天详解win10电脑屏幕亮度无法调节的具体解决手法
- ETL学习-前期准备
- xxx牌JUC学习加油奥利给001初始篇章
- 谷从何来,歌向何去——Google产品策略分析
- 如何快速保存PPT中的图片资源
- WPF自定义控件(教程含源码)-圆形进度条、环形进度条