Python的@property的使用

作者:Python测试开发 时间:2021-03-27 11:02:25 

目录
  • 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

标签:Python,@property
0
投稿

猜你喜欢

  • 基础的十进制按位运算总结与在Python中的计算示例

    2021-12-29 10:45:39
  • Centos7 Python3下安装scrapy的详细步骤

    2021-12-03 10:59:26
  • Python搭建代理IP池实现检测IP的方法

    2023-10-05 04:42:51
  • 解决PyCharm不在run输出运行结果而不是再Console里输出的问题

    2023-05-01 17:47:17
  • 一张图带我们入门Python基础教程

    2021-07-27 14:19:15
  • Python实现全局变量的两个解决方法

    2021-03-23 22:43:44
  • 浅谈Pycharm中的Python Console与Terminal

    2021-09-19 07:20:42
  • Python实战之手写一个搜索引擎

    2023-07-11 21:16:49
  • 对Python+opencv将图片生成视频的实例详解

    2022-01-03 08:42:16
  • 960px下的黄金分割

    2009-07-31 14:33:00
  • python中的列表与元组的使用

    2023-07-23 08:25:12
  • python将视频转换为全字符视频

    2023-08-08 21:01:02
  • Python PyInstaller安装和使用教程详解

    2021-05-12 01:28:40
  • 帮助你分析MySQL的数据类型以及建库策略

    2009-02-23 17:39:00
  • Python3如何使用多线程升程序运行速度

    2023-02-06 05:11:42
  • 在ASP.NET 2.0中操作数据之十二:在GridView控件中使用TemplateField

    2023-07-07 07:02:50
  • python实现简单五子棋游戏

    2021-04-04 16:15:57
  • 如何使用pandas读取txt文件中指定的列(有无标题)

    2022-04-25 15:30:18
  • Python 遍历子文件和所有子文件夹的代码实例

    2021-02-09 17:21:34
  • Bootstrap select多选下拉框实现代码

    2023-09-15 12:44:55
  • asp之家 网络编程 m.aspxhome.com