【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 ...
随机推荐
- 【自用】无限级分类获取SQL语句
自定义函数: 1 USE [ExpenseCenter_Fibrogen] 2 GO 3 /****** Object: UserDefinedFunction [dbo].[GetSubordina ...
- 存下吧!Spring高频面试题总结
Spring是什么? Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. Spring的优点 通过控制反转和依赖注入实现松耦合. 支持面向切面的编程,并且把应用业务逻辑和系统 ...
- css设置单行多行超出显示省略号
单行: width: 200px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 多行: text-overflow: ...
- 2022-05-15:N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件; 问题2:至
2022-05-15:N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输. 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件: 问题2:至 ...
- 2021-02-27:假设一个固定大小为W的窗口,依次划过arr,返回每一次滑出状况的最大值。例如,arr = [4,3,5,4,3,3,6,7], W = 3。返回:[5,5,5,4,6,7]。
2021-02-27:假设一个固定大小为W的窗口,依次划过arr,返回每一次滑出状况的最大值.例如,arr = [4,3,5,4,3,3,6,7], W = 3.返回:[5,5,5,4,6,7]. 福 ...
- 2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai)
2021-05-24:盛最多水的容器.给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 ...
- Django4全栈进阶之路4 APP注册
在 Django 4 中,应用(app)的注册是通过在项目的 settings.py 文件中添加应用名称来实现的.具体步骤如下: 在项目的根目录下创建一个应用目录,该目录应包含一个 apps.py 文 ...
- windows server 2012 2019启动 开机自动启动 项设置
1.第一种方法:打开运行功能,运行shell:startup,打开管理员用户启动项目录.将想要设置成开机自启的程序快捷方式添加到其中即可,或者删除其中快捷方式即可取消开机自启.2.第二种方法:打开系统 ...
- 2023-05-22:给定一个长度为 n 的字符串 s ,其中 s[i] 是: D 意味着减少; I 意味着增加。 有效排列 是对有 n + 1 个在 [0, n] 范围内的整数的一个排列 perm
2023-05-22:给定一个长度为 n 的字符串 s ,其中 s[i] 是: D 意味着减少: I 意味着增加. 有效排列 是对有 n + 1 个在 [0, n] 范围内的整数的一个排列 perm ...
- kali系统安装redis步骤
环境: 攻击机:Kali 5.16.0-kali7-amd64 192.168.13.78 靶机: Kali 5.16.0-kali7-amd64 192.168.13.94 安装 ...