Python中的property类和@property装饰器

在Python的类中,为了避免使用者直接在类的外部操作属性和方法,我们可以将属性和方法设置成私有属性和私有方法。

如果我们需要访问私有属性和私有方法,可以用包含get/set的方法来间接访问。

如果要避免脏数据的出现,隐藏方法实现细节,保证数据的安全性,我们可以在包含get/set的方法中添加一些验证和干扰的代码。

参考:https://mp.csdn.net/postedit/90734040

get/set是通过方法的方式来间接访问属性和方法,接下来我们介绍通过属性的方式来访问属性和方法:property。

一、property类的使用

property的意义就是属性、性质,在python中主要用来为属性操作提供便利。

在Python中,提供了一个叫做property的类,通过创建property类的对象,来将私有属性设置成普通的属性,可以不再使用属性的get方法的调用方式,而像普通的公有属性一样去使用属性。

class City(object):def __init__(self):self.__name = 'SZ'self.__person = 1000000def __get_name(self):return self.__namedef __set_person(self, person):if isinstance(person, int):if person > 1000000:self.__person = personelse:print('输入的人数错误!')else:print("人数是正整数!")def __get_person(self):return self.__person# 通过创建property的对象,将私有方法变成一个属性给外部访问name = property(__get_name)# 通过创建property的对象,将私有属性变成外部可以访问和修改该的属性person = property(__get_person, __set_person)c = City()
print(c.name)
print(c.person)
# name属性没有写set的相关方法,所以property对象属性在外部不能修改
# c.name = 'GZ'
print(c.name)
c.person = 100000000
print(c.person)

运行结果:

SZ
1000000
SZ
100000000

property是一个类,init方法由四个参数组成(可点击进入源码查看),实例化后返回一个用来操作属性的对象

参数一:属性的获取方法,参数二:属性的设置方法,参数三:属性的删除方法,参数四:属性的描述

通过property类实例对象以后,在使用对象中的属性时,就可以像使用普通公有属性一样来调用。

但是实际调用的还是set/get方法,如上面的name没有set方法,所以不能修改值。

在实例property对象时,不是所有的参数都需要写,比如示例中的name只提供了get方法,person只提供了get方法和set方法,并且都是私有的方法(property里也可以传入普通方法)。这样就完全隐藏了内部的实现细节。

二、@property装饰器的使用

Python语法中,装饰器的作用是提供装饰的功能,在不改变原来函数功能的基础上,添加新的功能。

这种形式被称为语法糖。语法糖指那些没有给计算机语言添加新功能,而只是对人类来说更好用的语法。

利用@property装饰器,可以用来简化使用property类的方法。

class City(object):def __init__(self):self.__name = 'SZ'self.__person = 1000000@propertydef name(self):return self.__name@propertydef person(self):return self.__person@person.setterdef person(self, person):if isinstance(person, int):if person > 1000000:self.__person = personelse:print('输入的人数错误!')else:print("人数是正整数!")c = City()
print(c.name)
print(c.person)
# name属性没有写set的相关方法,所以property对象属性在外部不能修改
# c.name = 'GZ'
print(c.name)
c.person = 100000000
print(c.person)

运行结果:

SZ
1000000
SZ
100000000

通过@property装饰器的方式,可以替换property类的方法,使用起来更简单。

注意:

1.在使用@property装饰属性时,只能装饰获取方法(获取属性的方法)

2.@property装饰属性时,set/get方法不需要在属性名前加set和get,直接写属性名即可

3.如果一个属性同时有set/get方法,那么要先实现@property对获取方法的定义,再实现设置方法的定义,定义set方法时使用  @xxx.setter装饰,xxx要和获取方法名保持一致。如:上面的person获取方法被@property装饰,person设置方法被 @person.setter装饰

Python中的property类和@property装饰器相关推荐

  1. python 三个内置装饰器,python中自带的三个装饰器

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...

  2. python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...

    本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出. property装饰器 功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能. ...

  3. python三层装饰器-python中自带的三个装饰器的实现

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...

  4. python中自带的三个装饰器

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A():@property ...

  5. Python中的元类是什么?

    元类是什么,我们将它们用于什么? #1楼 请注意,此答案适用于2008年编写的Python 2.x,元类在3.x中略有不同. 元类是使"类"工作的秘诀. 新样式对象的默认元类称为& ...

  6. python vector 初始化_一文带你走进Python中的数据类

    全文共2607字,预计学习时长14分钟 图源:unsplash 数据类适用于Python3.7或更高版本,它不仅可以用作数据容器,还可以编写样板代码,简化创建类的过程. 创建第一个数据类 创建一个数据 ...

  7. python装饰器传递参数_Python装饰器高级版—Python类内定义装饰器并传递self参数...

    本文重点:解决了类里面定义的装饰器,在同一个类里面使用的问题,并实现了装饰器的类属性参数传递 目录: 一.基本装饰器 二.在类里定义装饰器,装饰本类内函数 三.类装饰器 正文: 一.基本装饰器 装饰不 ...

  8. Python中的元类及元类实现的单例模式

    https://www.cnblogs.com/tkqasn/p/6524879.html 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元 ...

  9. python︱函数、for、if、_name_、迭代器、防范报错、类定义、装饰器、argparse模块、yield

    新手入门python,开始写一些简单函数,慢慢来,加油~ 文章目录 一.函数 +三个内建函数filter,map和reduce + if 1.def/lambda 2.if 如果if + for列表的 ...

最新文章

  1. HSSFWorkbook 与 XSSFWorkbook
  2. Oracle根据日期计算某月的天数
  3. python有趣代码-wtfPython―Python中一组有趣微妙的代码【收藏】
  4. Codeforces 766E
  5. iOS 一个开发者账号 多台Mac 共用
  6. windows使用python3.4生成二维码
  7. 笔刷怎么做_原来是这样:用PS笔刷做出颜料肌理效果!
  8. php后端语言的基本语法
  9. mysql weindow 安装_windows下怎么安装mysql
  10. php继承exten,es6,extends_react中通过extend继承,父组件为什么能访问子组件的属性,es6,extends,react.js - phpStudy...
  11. 求解偏微分方程开源有限元软件deal.II学习--Step 37
  12. EXCEL 宏 拆分数据表 VBA 视频教程下载
  13. bzoj 1171 大sz的游戏 2892 强袭作战 (线段树+单调队列+永久性flag)
  14. 解决SVN造成的桌面图标问号
  15. java insert方法_Java StringBuilder insert()方法
  16. 《C++ Primer Plus》第八章习题与参考答案
  17. flutter与RN对比
  18. Android应用内增量更新
  19. 神马? 网飞(Netflix)程序员的基本薪资居然是谷歌的2倍多...
  20. 程序员的核心竞争力是什么?

热门文章

  1. Linux下实用的JAVA内存泄露监控命令及工具
  2. Java关键字(六)——super
  3. 洛谷——P1478 陶陶摘苹果(升级版)
  4. Windows Server 2008 R2 域控DOS命令
  5. Java RMI 介绍
  6. simlescalar CPU模拟器源代码分析
  7. mysql参数配置调优详解配置(1)
  8. 公共语言运行库中的程序集-04强命名的程序集
  9. JReBel激活码注册申请--方便Java开发中使用Jrebel热部署
  10. 用until编写一段shell程序,计算1~10的平方