参考自:Python的@property是干嘛的?作者:Python测试开发

如果我们设置类的属性私有化,那么可以使用@property 使属性可以被外部访问并修改。

在使用 @property 之前,需要先了解几个概念。

  • _age (单下划线):这种属性表示约定私有,非真正的私有
  • __age(双下划线):表示私有,外部无法访问
  • __age__(前后双下划线):这种属性表示系统属性(可选)
  • age_(后单下划线):这种属性是为了避免和保留关键字冲突。

code01: 自定义学生类

class Student(object):
_age = 18
__sex = "man" ming = Student()

可以通过ming._age访问age的值,但是ming.__sex就会报错,提示AttributeError: 'Student' object has no attribute '__age'

既然私有属性无法访问,那么如何在外部进行访问和查看?

code02: 自定义方法访问私有属性

class Student(object):
_age = 18
__sex = "man" def get_sex(self):
return self.__sex def set_sex(self, sex):
self.__sex = sex ming = Student()

code02中,在Student内自定义了get_sex()set_sex()方法实现对私有属性的访问和修改。

>>> print(ming.get_sex())
'man'
>>> ming.set_sex("woman")
>>> ming.get_sex()
'woman'

code03: 使用@property访问私有属性

如果需要暴露的私有属性比较多,使用自定义方法就比较繁琐了。为此,Python提供了@property,实现同样的功能,并且更方便。

class Student(object):
_age = 18
__sex = "man" @property
def sex(self):
return self.__sex @age.setter
def sex(self,sex):
self.__sex = sex ming = Student()

code03中,使用@property直接将__sex私有属性转变为普通属性。

>>> print(ming.get_sex())
man
>>> print(ming.sex)
man
>>> ming.set_sex("woman")
>>> print(ming.sex)
woman

可以看到,ming.ageming.get_sex()的结果是一样。

不过@property只能访问,不能修改。如果要修改,还要配合setter使用,示例如下:

class Student(object):
_age = 18
__sex = "man" @property
def sex(self):
return self.__sex @sex.setter
def sex(self,sex):
self.__sex = sex ming = Student()

测试:

>>> print(ming.sex)
'man'
>>> ming.age = 20
>>> print(ming.age)
20

emmmm,还算方便。

可能会有些疑问:既然事先要设置私有属性,那为什么还要暴露出去?

个人认为,有些属性设置为私有后,能保证代码安全,而且使用@property能够统一接口和代码风格,如果属性需要设置只读,那么删掉setter方法就行了。如果修改属性的时候需要限制,也可以类似于以下方法进行限制:

class Student(object):
__age = 18
__sex = "man" @property
def sex(self):
return self.__sex @sex.setter
def sex(self,sex):
self.__sex = sex @property
def age(self):
return self.__age @age.setter
def age(self, new_age):
if new_age >0 and new_age <= 130:
self.__age = new_age
else:
raise ValueError("[ERROR] Invalid age value!") ming = Student()

上面的代码将age属性也设置为私有,并且使用@property公开。通过定义setter对age的数值进行限制。如果执行ming.age=200 ,则将会报错。

【Python】@property用法简述的更多相关文章

  1. python property用法

    参考 http://openhome.cc/Gossip/Python/Property.html http://pyiner.com/2014/03/09/Python-property.html ...

  2. python @property用法(转载)

    偶然碰到一篇讲解 @property 比较清晰的文章 记录下来 日常复习 # @property'''@property是python的一种装饰器,是用来修饰方法的 作用:我们可以使用@propert ...

  3. Python中“*”和“**”的用法 || yield的用法 || ‘$in’和'$nin' || python @property的含义

    一.单星号 * 采用 * 可将列表或元祖中的元素直接取出,作为随机数的上下限: import random a = [1,4] print(random.randrange(*a)) 或者for循环输 ...

  4. python property

    python property 在2.6版本中,添加了一种新的类成员函数的访问方式--property. 原型 class property([fget[, fset[, fdel[, doc]]]] ...

  5. Python高级用法总结

    Python很棒,它有很多高级用法值得细细思索,学习使用.本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式.迭代器和生成器.装饰器. 列表推导(list comprehensi ...

  6. python property详解

    Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情.在这篇文章中,我们将看到如何能做以下几点: 将类方法转换为只读属性 重新实现一个属性的setter和getter ...

  7. Cwinux简介及用法简述

    我在我的个人博客上发表了一篇文章 Cwinux简介及用法简述 http://apprentice89.com/cwinux_introduction_and_use/

  8. 转: __asm__ __volatile__内嵌汇编用法简述

    from: http://www.embedu.org/Column/Column28.htm __asm__ __volatile__内嵌汇编用法简述 作者:刘老师,华清远见嵌入式学院高级讲师,AR ...

  9. python property装饰器

    直接上代码: #!/usr/bin/python #encoding=utf-8 """ @property 可以将python定义的函数“当做”属性访问,从而提供更加友 ...

  10. python argparse用法总结

    转:python argparse用法总结 1. argparse介绍 argparse是python的一个命令行解析包,非常适合用来编写可读性非常好的程序. 2. 基本用法 prog.py是我在li ...

随机推荐

  1. Java web文件服务器的简单实现

    先分享一个好用的聚合搜索引擎,https://www.tomfind.com/ ,支持谷歌.百度.搜狗.bing.360一键切换,支持网页.音乐.购物.视频搜索.支持抖音.快手.哔哩哔哩.微信.头条. ...

  2. 2023-03-26:给定一个二维数组matrix, 每个格子都是正数,每个格子都和上、下、左、右相邻。 你可以从任何一个格子出发,走向相邻的格子, 把沿途的数字乘起来,希望得到的最终数字中,结尾的0

    2023-03-26:给定一个二维数组matrix, 每个格子都是正数,每个格子都和上.下.左.右相邻. 你可以从任何一个格子出发,走向相邻的格子, 把沿途的数字乘起来,希望得到的最终数字中,结尾的0 ...

  3. 2022-04-02:你只有1*1、1*2、1*3、1*4,四种规格的砖块。 你想铺满n行m列的区域,规则如下: 1)不管那种规格的砖,都只能横着摆, 比如1*3这种规格的砖,3长度是水平

    2022-04-02:你只有11.12.13.14,四种规格的砖块. 你想铺满n行m列的区域,规则如下: 1)不管那种规格的砖,都只能横着摆, 比如1*3这种规格的砖,3长度是水平方向,1长度是竖直方 ...

  4. Django4全栈进阶之路1 Django4下载与安装

    python 下载安装: 下载网址:https://www.python.org/downloads/ 安装方法:https://www.cnblogs.com/beichengshiqiao/p/1 ...

  5. Django认证流程源码及自定义 Backend

    Django自己的认证方法只能认证用户名和密码 user = authenticate(**credentials) # authenticate会自动校验用户名和密码 authenticate 源码 ...

  6. 六大云端 Jupyter Notebook 平台测评

    有许多方法可以与其他人共享静态 Jupyter 笔记本,例如把它发布在 GitHub 上或通过 nbviewer 链接进行分享. 但是,如果接收人已经安装了 Jupyter Notebook 环境,那 ...

  7. DIY制作隔离信号注入变压器

    最近在学习模电知识,接触到了测量运放环路增益,需要使用合适的注入变压器,查找资料发现商用信号注入变压器价格昂贵,不适合个人学习使用.看到LOTO使用普通音频变压器做测试,也跟技术群友做了交流,尝试使用 ...

  8. 洛谷 P4859 已经没有什么好害怕的了

    题目描述 学姐 4 了. 有 \(n\) 个糖果和 \(n\) 个药片,它们要进行一一配对.每个糖果或药片都具有互不相同的能量值,要求配对后,糖果比药片能量高的对数,比剩下的对数恰好多 \(k\),求 ...

  9. PHP文件包含总结

    1.文件包含小知识 1.1 包含函数 PHP共有4个与文件包含相关的函数: include require include_once require_once include与include_once ...

  10. FreeFileSync结合任务计划实现T级数据的全量备份和每日十几G数据的增量自动备份

    1. 背景 公司现有nas存储中有共计1.8T左右的文件数据(一般是pdf.excel.图片.压缩文件等等格式),因为nas无法做备份:担心后面nas出现故障造成数据丢失,现急需一个解决方案实现如下目 ...