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装饰器的使用相关推荐

  1. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  2. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  3. python装饰器 property_python @property装饰器

    1.通过@property装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对"()"小括号. class Person: def __init__(self, name ...

  4. 初学者python笔记(类的装饰器、property方法、元类)

    文章目录 上下文协议管理 类的装饰器基本原理 property方法的巧用 利用描述符自定制property property下的setter与deleter Python的元类 元类的概念 自定义元类 ...

  5. 浅析Python装饰器中的@property

    点击上方"Go语言进阶学习",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 不堪玄鬓影,来对白头吟. 一.使用@prop ...

  6. python中的@property装饰器

    引言 本文将要介绍Python中@property装饰器,这是一种python风格的getters和setters方法.Python编程为我们提供了一个内置的@property装饰器,它使面向对象编程 ...

  7. python内置装饰器property_Python中的内置装饰器之property

    装饰器是Python中很重要的一个概念,但是这篇文档不介绍装饰器的实现,我们只需要知道装饰器可以实现一些功能: Python中也包含一些自带的装饰器,这次就说一下属性装饰器property 相关知识点 ...

  8. Python @property装饰器详解

    之前的文章中,我们探究了@后接某个自定义函数的用法,实际上,更常见.完备.简单的应用在于对@和python内置的函数进行结合:这可以避免造轮子的行为. 我们知道, Python 内置了3种函数装饰器, ...

  9. python之装饰器初识

    一.@abstractmethod 1.抽象类的作用:规范编程模式 多人开发.复杂的需求.后期的扩展 是一种用来帮助我们完成规范化的手段 2.如何定义抽象类 1,from abc import ABC ...

  10. python教程:类的装饰器方法、特殊成员方法

    装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 1.静态方法 在方法名前加上@staticmethod装饰 ...

最新文章

  1. python批量导入MongoDB数据库
  2. 使用get set方法添减属性_头皮银屑病“克星”使用方法,你GET了吗?
  3. getSystemService
  4. 7-11 mmh学长的万能日历 (20分)
  5. 用webpack打包加密静态配置文件
  6. 安装制作 基础篇(一) 基本概念
  7. oracle 报表聚合,Oracle很实用的汇总报表实现方式!grouping_id
  8. mov文件如何转换成mp4?巧用嗨格式视频转换器
  9. 安装ansys时出现问题 MS.NET Framework would you like to retry?的解决办法:
  10. 领导力有哪些方面?什么是领导力?
  11. npm shrinkwrap
  12. 【早期笔记】java 开发环境搭建
  13. 机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)...
  14. 一日一签免费算卦_一日一签app免费算卦
  15. 计算机无法屏幕亮度,今天详解win10电脑屏幕亮度无法调节的具体解决手法
  16. ETL学习-前期准备
  17. xxx牌JUC学习加油奥利给001初始篇章
  18. 谷从何来,歌向何去——Google产品策略分析
  19. 如何快速保存PPT中的图片资源
  20. WPF自定义控件(教程含源码)-圆形进度条、环形进度条

热门文章

  1. 戴尔服务器加无线网卡用不了网,电脑安装了无线网卡却不能用是怎么回事?
  2. 快速学习-web3.js简介与入门
  3. go语言学习网站大全
  4. oracle查看登录失败次数,Oracle取消用户连续登录失败次数限制
  5. 2021-2025年中国阿莫雷德行业市场供需与战略研究报告
  6. 微信小程序服务器请求和上传数据,上传图片并展示,提交表单完整实例代码附效果图
  7. 隐匿函数,二分法 冒泡排序
  8. Tomcat后台管理
  9. apache ActiveMQ反序列化漏洞(CVE-2015-5254)复现
  10. 如果编程语言都是漂亮的小姐姐,你会喜欢哪一个?