前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python @property的用法及含义全面解析

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

作者头像
狼啸风云
修改2022-09-03 21:20:58
2.2K0
修改2022-09-03 21:20:58
举报

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

代码语言:javascript
复制
class Rectangle(object):

  def __init__(self):

    self.width =10

    self.height=20

r=Rectangle()

print(r.width,r.height)

此时输出结果为10 20

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

代码语言:javascript
复制
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)  

代码语言:javascript
复制
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的错误,这样就保证的属性的安全性。同样为了解决对属性的操作,提供了封装方法的方式进行属性的修改

代码语言:javascript
复制
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,用处是删除属性,写法如下,具体实现不在赘述

代码语言:javascript
复制
@height.deleter

def height(self):

    del self.true_height

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

本文转自:https://www.jb51.net/article/134148.htm

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

代码语言:javascript
复制
class Rectangle(object):

  def __init__(self):

    self.width =10

    self.height=20

r=Rectangle()

print(r.width,r.height)

此时输出结果为10 20

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

代码语言:javascript
复制
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)

代码语言:javascript
复制
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的错误,这样就保证的属性的安全性。

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

代码语言:javascript
复制
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,用处是删除属性,写法如下,具体实现不在赘述。

代码语言:javascript
复制
@height.deleter

def height(self):

    del self.true_height

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档