【Python】@property用法简述
参考自: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.age和ming.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用法简述的更多相关文章
- python property用法
参考 http://openhome.cc/Gossip/Python/Property.html http://pyiner.com/2014/03/09/Python-property.html ...
- python @property用法(转载)
偶然碰到一篇讲解 @property 比较清晰的文章 记录下来 日常复习 # @property'''@property是python的一种装饰器,是用来修饰方法的 作用:我们可以使用@propert ...
- Python中“*”和“**”的用法 || yield的用法 || ‘$in’和'$nin' || python @property的含义
一.单星号 * 采用 * 可将列表或元祖中的元素直接取出,作为随机数的上下限: import random a = [1,4] print(random.randrange(*a)) 或者for循环输 ...
- python property
python property 在2.6版本中,添加了一种新的类成员函数的访问方式--property. 原型 class property([fget[, fset[, fdel[, doc]]]] ...
- Python高级用法总结
Python很棒,它有很多高级用法值得细细思索,学习使用.本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式.迭代器和生成器.装饰器. 列表推导(list comprehensi ...
- python property详解
Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情.在这篇文章中,我们将看到如何能做以下几点: 将类方法转换为只读属性 重新实现一个属性的setter和getter ...
- Cwinux简介及用法简述
我在我的个人博客上发表了一篇文章 Cwinux简介及用法简述 http://apprentice89.com/cwinux_introduction_and_use/
- 转: __asm__ __volatile__内嵌汇编用法简述
from: http://www.embedu.org/Column/Column28.htm __asm__ __volatile__内嵌汇编用法简述 作者:刘老师,华清远见嵌入式学院高级讲师,AR ...
- python property装饰器
直接上代码: #!/usr/bin/python #encoding=utf-8 """ @property 可以将python定义的函数“当做”属性访问,从而提供更加友 ...
- python argparse用法总结
转:python argparse用法总结 1. argparse介绍 argparse是python的一个命令行解析包,非常适合用来编写可读性非常好的程序. 2. 基本用法 prog.py是我在li ...
随机推荐
- 2023-02-25:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,YUV420P不要转换成YUV420SP。
2023-02-25:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,YUV420P不要转换成YUV420SP. 答案2023-02-25: 使用 github.com/ ...
- 2022-09-16:以下go语言代码输出什么?A:101;B:100;C:1;D:2。 package main import ( “fmt“ ) type MS struct {
2022-09-16:以下go语言代码输出什么?A:101:B:100:C:1:D:2. package main import ( "fmt" ) type MS struct ...
- 2022-06-21:golang选择题,以下golang代码输出什么?A:3;B:4;C:100;D:编译失败。 package main import ( “fmt“ ) func
2022-06-21:golang选择题,以下golang代码输出什么?A:3:B:4:C:100:D:编译失败. package main import ( "fmt" ) fu ...
- hexrays sdk study
There are 20 examples in /ida_path/plugins/hexrays_sdk/plugins, you can learn from that, you can als ...
- Vagrant 学习笔记:搭建 K8s 集群
Vagrant学习笔记:搭建K8s集群 通常情况下,我们在使用VMware.VirtualBox这一类虚拟机软件创建虚拟开发环境时,往往需要经历寻找并下载操作系统的安装镜像文件,然后根据该镜像文件启动 ...
- Springboot+actuator+prometheus+Grafana集成
本次示例以Windows示例 推荐到官网去下载:Windows版的应用程序 下载最新版 prometheus-2.37.8.windows-amd64 压缩包:解压就行 下载最新版 grafana-9 ...
- 使用numpy计算分子内坐标
技术背景 当我们打开一个用于表示分子构象的xyz文件或者pdb文件,很容易可以理解这种基于笛卡尔坐标的空间表征方法.但是除了笛卡尔坐标表示方法之外,其实也有很多其他的方法用于粗粒化或者其他目的的表征方 ...
- WPF中进度条同步实现
WPF界面的编写 滑动条的显示 //前台界面的设计 <Border Grid.Row="1" Background="Transparent" Borde ...
- 快速把PDF文档里的表格粘贴到excel的方法
1 打开需要复制的PDf文件,点一下页面上方的"选择文本"按钮(如下图中手图标左边的箭头),以便选中文本 2 ctrl c 需要复制的表格,到excel中ctrl v.这时候所有类 ...
- 使用hashicorp Raft开发分布式服务
使用hashicorp Raft开发高可用服务 开发raft时用到的比较主流的两个库是Etcd Raft 和hashicorp Raft,网上也有一些关于这两个库的讨论.之前分析过etcd Raft, ...