zoukankan      html  css  js  c++  java
  • python @property的用法及含义全面解析

    在接触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就可以,不定义代表禁止其他操作。

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

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

    1
    2
    3
    4
    5
    6
    class Rectangle(object):
      def __init__(self):
        self.width =10
        self.height=20
    r=Rectangle()
    print(r.width,r.height)

    此时输出结果为10 20

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

    1
    2
    3
    4
    5
    6
    7
    8
    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)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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的错误,这样就保证的属性的安全性。

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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,用处是删除属性,写法如下,具体实现不在赘述。

    1
    2
    3
    @height.deleter
    def height(self):
        del self.true_height

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

  • 相关阅读:
    快速创建jsp页面的方法
    Webstorm的一些常用快捷键
    eclipse 怎么在new菜单里添加JSP file选项?
    人生最重要的时候,从30岁到35岁:为生命多积累一些厚度
    android 生命周期四代码
    android WebView onJsAler onJsC…
    android java js 回调 真心好用
    linux下dlopen的使用
    android ndk jni 实例1
    android 退出程序 结束线程
  • 原文地址:https://www.cnblogs.com/sgfg-1314/p/10110680.html
Copyright © 2011-2022 走看看