Python的@property的使用
作者:Python测试开发 发布时间:2021-03-27 11:02:25
标签:Python,@property
目录
1、几个概念
2、举个例子
3、解决问题
4、换个方法
通常,当我们需要对对象的敏感属性或者不希望外部直接访问的属性进行私有化,但是某些时候我们又需要对这些私有属性进行修改,该怎么处理呢?
1、几个概念
_a(前置单下划线),这种属性仅表示约定的私有,非真正的私有。
__a(前置双下划线),这种属性表示私有,无法在外部访问。
_a_(前后双下划线),这种属性标识系统属性。(可选)
a_(后置单下划线),这种属性是为了避免和保留关键字冲突。(可选)
2、举个例子
定义一个类:
class Student(object):
_sex='male'
__age=0
执行:(私有属性无法在外部访问)
>>> stu = Student()
>>> stu._sex
'male'
>>> stu.__age
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__age'
>>>
3、解决问题
从上面的类中我们可以看到,私有属性无法在类实例中访问,怎么办呢?当我们需要对类的私有属性__age进行查询和修改的时候,我们可以定义get_age和set_age去实现。
class Student(object):
_sex='male'
__age=0
def get_age(self):
return self.__age
def set_age(self,age):
self.__age = age
执行:
>>> stu = Student()
>>> stu.get_age()
0
>>> stu.set_age(18)
>>> stu.get_age()
18
>>>
4、换个方法
但是上面的这种方式略显复杂,如果在私有属性较多的类中就不太适用了,所以我们期望寻求一种更简单的方式去解决这个问题,比如将这个私有属性转化为另一个属性。告诉你个好消息,Python已经帮我们实现了,这就是@property。
class Student(object):
_sex='male'
__age=0
def get_age(self):
return self.__age
def set_age(self,age):
self.__age = age
@property
def age(self):
return self.__age
执行:
>>> from payhlib import Student
>>> s = Student()
>>> s.age
0
>>> s.set_age(19)
>>> s.age
19
>>
在上面我们将__age私有属性转换为了age属性,你可能会想,既然私有属性转换为了属性,那我们是不是可以直接修改它呢?答案是不行,因为property虽然将__age转换为了属性,但是其不具备setter功能,需要我们去添加。
>>> from payhlib import Student
>>> s = Student()
>>> s.age
0
>>> s.age=20
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
>>>
添加setter方法
class Student(object):
_sex='male'
__age=0
def get_age(self):
return self.__age
def set_age(self,age):
self.__age = age
@property
def age(self):
return self.__age
@age.setter
def age(self,value):
self.__age=value
执行:
>>> from payhlib import Student
>>> s = Student()
>>> s.age
0
>>> s.age=20
>>> s.age
20
>>>
到此,@peoperty分享完毕,关于它的实现原理你可以查看源码进行研究。更多相关Python的@property内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:https://juejin.cn/post/6983488887024779271


猜你喜欢
- 有时候使用到获取本机IP,就采用以下方式进行。#!/usr/bin/python import socketimport stru
- Python中的字符串方法是从python1.6到2.0慢慢加进来的,它们也被加到了Jython中。这些方法实现了string模块的大部分方
- 概要相信很多像我一样初入门前端的时候,都是基于某个模板来学。 vue-element-admin 或者 vue-element-templa
- 1、取得控制台应用程序的根目录方法 方法1、Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径
- 目录1. Django简介Django是什么?Django前景Django框架核心2. 设计模式MVT模式3. 开发环境简介4.创建虚拟环境
- 本文实例为大家分享了Tensorflow实现神经网络拟合线性回归的具体代码,供大家参考,具体内容如下一、利用简单的一层神经网络拟合一个函数
- 背景介绍Pandas的DataFrame和Series在Matplotlib基础上封装了一个简易的绘图函数,使得数据处理过程中方便可视化查看
- 一、下载SQL Server 2008 R2安装文件cn_sql_server_2008_r2_enterprise_x86_x64_ia6
- Context 背景 和 适用场景Context 的背景Golang 在 1.6.2 的时候还没有自己的 context,在1.7的版本中就
- 如何做一个随机密码产生器?<%genPassword = ""RandomizeFor&nbs
- 接下来我们会进入 字符串常用方法的应用阶段,重点学习字符串的内置函数。正式学习之前,我们要先了解一个词 对象 (划重点,不是男女朋友!),只
- 所有数据库mysqlcheck --auto-repair -A -o -uroot -pyigeorg单一数据库mysqlcheck --
- 在python中,通常通过dict和zip组合来构建键值对。比如:aid = [i for i in range(10)]name = [[
- 在python中操作文件算是一个基本操作,但是选对了模块会让我们的效率大大提升。本篇整理了两种模块的常用方法,分别是os模块和shutil模
- 通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错。所以最好在做任何操作之前,先判断文件是否存在。这里将介绍三
- 前言最近在工作中遇到一个需求,就是要把SQLite数据中没有存储的文件名的文件删除掉,想来想去还是决定用python。所以也就花了一天半的时
- 本文为大家分享了MySQL 8.0.29 安装配置方法图文教程,供大家参考,具体内容如下一、下载MySQL1、进入MySQL官网MySQL并
- (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clus
- 在数据库中,对性能影响最大的包括数据库的锁策略、缓存策略、索引策略、存储策略、执行计划优化策略。索引策略决定数据库快速定位数据的效率,存储策
- argparse是python标准库里面用来处理命令行参数的库命令行参数分为位置参数和选项参数:位置参数就是程序根据该参数出现的位置来确定的