python @property的用法及含义全面解析

作者:jingxian 时间:2023-04-06 00:42:28 

在接触python时最开始接触的代码,取长方形的长和宽,定义一个长方形类,然后设置长方形的长宽属性,通过实例化的方式调用长和宽,像如下代码一样。


class Rectangle(object):
 def __init__(self):
   self.width =10
   self.height=20
r=Rectangle()
print(r.width,r.height)

此时输出结果为10 20

但是这样在实际使用中会产生一个严重的问题,__init__ 中定义的属性是可变的,换句话说,是使用一个系统的所有开发人员在知道属性名的情况下,可以进行随意的更改(尽管可能是在无意识的情况下),但这很容易造成严重的后果。


class Rectangle(object):
 def __init__(self):
   self.width =10
   self.height=20
r=Rectangle()
print(r.width,r.height)
r.width=1.0
print(r.width,r.height)

以上代码结果会输出宽1.0,可能是开发人员不小心点了一个小数点上去,但是会系统的数据错误,并且在一些情况下很难排查。

这是生产中很不情愿遇到的情况,这时候就考虑能不能将width属性设置为私有的,其他人不能随意更改的属性,如果想要更改只能依照我的方法来修改,@property就起到这种作用(类似于java中的private)


class Rectangle(object):
 @property
 def width(self):
   #变量名不与方法名重复,改为true_width,下同
   return self.true_width

@property
 def height(self):
   return self.true_height
s = Rectangle()
#与方法名一致
s.width = 1024
s.height = 768
print(s.width,s.height)

(@property使方法像属性一样调用,就像是一种特殊的属性)

此时,如果在外部想要给width重新直接赋值就会报AttributeError: can't set attribute的错误,这样就保证的属性的安全性。

同样为了解决对属性的操作,提供了封装方法的方式进行属性的修改


class Rectangle(object):
 @property
 def width(self):
   # 变量名不与方法名重复,改为true_width,下同
   return self.true_width
 @width.setter
 def width(self, input_width):
   self.true_width = input_width
 @property
 def height(self):
   return self.true_height
 @height.setter
 #与property定义的方法名要一致
 def height(self, input_height):
   self.true_height = input_height
s = Rectangle()
# 与方法名一致
s.width = 1024
s.height = 768
print(s.width,s.height)

此时就可以对“属性”进行赋值操作,同样的方法还del,用处是删除属性,写法如下,具体实现不在赘述。


@height.deleter
def height(self):
   del self.true_height

总结一下@property提供了可读可写可删除的操作,如果像只读效果,就只需要定义@property就可以,不定义代表禁止其他操作。

来源:http://blog.csdn.net/qq_41673534/article/details/79221070

标签:python,@property,用法
0
投稿

猜你喜欢

  • 干掉一堆mysql数据库,仅需这样一个shell脚本(推荐)

    2024-01-14 19:48:51
  • 获取SQL Server数据库元数据的几种方法

    2024-01-17 16:00:44
  • python缩进长度是否统一

    2022-08-02 00:37:11
  • python多线程之事件Event的使用详解

    2022-12-21 11:46:10
  • 详解webpack3编译兼容IE8的正确姿势

    2024-02-26 23:18:17
  • 如何完美的建立一个python项目

    2021-02-20 21:07:26
  • python中图像通道分离与合并实例

    2021-04-02 00:09:48
  • Python实现猜拳与猜数字游戏的方法详解

    2022-06-17 18:32:25
  • ASP万用分页程序

    2007-09-21 12:45:00
  • Python在线运行代码助手

    2022-05-04 04:09:21
  • JS实现点击下拉菜单把选择的内容同步到input输入框内的实例

    2023-09-08 19:50:10
  • 一文详解golang延时任务的实现

    2024-03-23 16:00:16
  • Python设计模式编程中的备忘录模式与对象池模式示例

    2023-02-06 05:48:43
  • Python中变量的作用域的具体使用

    2022-11-01 00:20:04
  • 详解duck typing鸭子类型程序设计与Python的实现示例

    2022-12-26 07:12:19
  • Python的运算符重载详解

    2022-08-19 21:51:52
  • JS onmousemove鼠标移动坐标接龙DIV效果实例

    2023-08-08 19:59:13
  • SQL中varchar和nvarchar的基本介绍及其区别

    2024-01-16 22:16:53
  • python获取全国城市pm2.5、臭氧等空气质量过程解析

    2023-06-04 21:46:07
  • CSS中的标点符号用法

    2008-10-03 11:58:00
  • asp之家 网络编程 m.aspxhome.com