Python中的property类和@property装饰器
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装饰器相关推荐
- python 三个内置装饰器,python中自带的三个装饰器
说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...
- python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...
本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出. property装饰器 功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能. ...
- python三层装饰器-python中自带的三个装饰器的实现
说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @propert ...
- python中自带的三个装饰器
说到装饰器,就不得不说python自带的三个装饰器: 1.@property 将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A():@property ...
- Python中的元类是什么?
元类是什么,我们将它们用于什么? #1楼 请注意,此答案适用于2008年编写的Python 2.x,元类在3.x中略有不同. 元类是使"类"工作的秘诀. 新样式对象的默认元类称为& ...
- python vector 初始化_一文带你走进Python中的数据类
全文共2607字,预计学习时长14分钟 图源:unsplash 数据类适用于Python3.7或更高版本,它不仅可以用作数据容器,还可以编写样板代码,简化创建类的过程. 创建第一个数据类 创建一个数据 ...
- python装饰器传递参数_Python装饰器高级版—Python类内定义装饰器并传递self参数...
本文重点:解决了类里面定义的装饰器,在同一个类里面使用的问题,并实现了装饰器的类属性参数传递 目录: 一.基本装饰器 二.在类里定义装饰器,装饰本类内函数 三.类装饰器 正文: 一.基本装饰器 装饰不 ...
- Python中的元类及元类实现的单例模式
https://www.cnblogs.com/tkqasn/p/6524879.html 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元 ...
- python︱函数、for、if、_name_、迭代器、防范报错、类定义、装饰器、argparse模块、yield
新手入门python,开始写一些简单函数,慢慢来,加油~ 文章目录 一.函数 +三个内建函数filter,map和reduce + if 1.def/lambda 2.if 如果if + for列表的 ...
最新文章
- HSSFWorkbook 与 XSSFWorkbook
- Oracle根据日期计算某月的天数
- python有趣代码-wtfPython―Python中一组有趣微妙的代码【收藏】
- Codeforces 766E
- iOS 一个开发者账号 多台Mac 共用
- windows使用python3.4生成二维码
- 笔刷怎么做_原来是这样:用PS笔刷做出颜料肌理效果!
- php后端语言的基本语法
- mysql weindow 安装_windows下怎么安装mysql
- php继承exten,es6,extends_react中通过extend继承,父组件为什么能访问子组件的属性,es6,extends,react.js - phpStudy...
- 求解偏微分方程开源有限元软件deal.II学习--Step 37
- EXCEL 宏 拆分数据表 VBA 视频教程下载
- bzoj 1171 大sz的游戏 2892 强袭作战 (线段树+单调队列+永久性flag)
- 解决SVN造成的桌面图标问号
- java insert方法_Java StringBuilder insert()方法
- 《C++ Primer Plus》第八章习题与参考答案
- flutter与RN对比
- Android应用内增量更新
- 神马? 网飞(Netflix)程序员的基本薪资居然是谷歌的2倍多...
- 程序员的核心竞争力是什么?