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

  • 相关阅读:
    PHP 5.5.0 Alpha5 发布
    Ubuntu Touch 只是另一个 Android 皮肤?
    MariaDB 10 已经为动态列提供文档说明
    Percona Toolkit 2.1.9 发布,MySQL 管理工具
    Oracle Linux 6.4 发布
    Ruby 2.0.0 首个稳定版本(p0)发布
    Apache Pig 0.11.0 发布,大规模数据分析
    Node.js 0.8.21 稳定版发布
    红薯 MySQL 5.5 和 5.6 默认参数值的差异
    Django 1.5 正式版发布,支持 Python 3
  • 原文地址:https://www.cnblogs.com/sgfg-1314/p/10110680.html
Copyright © 2011-2022 走看看