加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Python property 函数 概念属性

发布时间:2022-07-07 07:44:55 所属栏目:编程 来源:互联网
导读:前面章节中,我们一直在用类对象.属性的方式访问类中定义的属性,其实这种做法是欠妥的,因为它破坏了类的封装原则。正常情况下,类包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。 因此,在不破坏类封装原则的基础上,
Python property 函数 概念属性
  前面章节中,我们一直在用“类对象.属性”的方式访问类中定义的属性,其实这种做法是欠妥的,因为它破坏了类的封装原则。正常情况下,类包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。
 
  因此,在不破坏类封装原则的基础上,为了能够有效操作类中的属性,类中应包含读(或写)类属性的多个 getter(或 setter)方法,这样就可以通过“类对象.方法(参数)”的方式操作属性,例如:
  class CLanguage:
      #构造函数
      def __init__(self,name):
          self.name = name
      #设置 name 属性值的函数
      def setname(self,name):
          self.name = name
      #访问nema属性值的函数
      def getname(self):
          return self.name
      #删除name属性值的函数
      def delname(self):
          self.name="xxx"
  clang = CLanguage("C语言中文网")
  #获取name属性值
  print(clang.getname())
  #设置name属性值
  clang.setname("Python教程")
  print(clang.getname())
  #删除name属性值
  clang.delname()
  print(clang.getname())
  运行结果为:
  C语言中文网
  Python教程
  xxx
 
  可能有读者觉得,这种操作类属性的方式比较麻烦,更习惯使用“类对象.属性”这种方式。
 
  庆幸的是,Python 中提供了 property() 函数,可以实现在不破坏类封装原则的前提下,让开发者依旧使用“类对象.属性”的方式操作类中的属性。
 
  property() 函数的基本使用格式如下:
  属性名=property(fget=None, fset=None, fdel=None, doc=None)
 
  其中,fget 参数用于指定获取该属性值的类方法,fset 参数用于指定设置该属性值的方法,fdel 参数用于指定删除该属性值的方法,最后的 doc 是一个文档字符串,用于说明此函数的作用。
  注意,在使用 property() 函数时,以上 4 个参数可以仅指定第 1 个、或者前 2 个、或者前 3 个,当前也可以全部指定。也就是说,property() 函数中参数的指定并不是完全随意的。
 
  例如,修改上面的程序,为 name 属性配置 property() 函数:
  class CLanguage:
      #构造函数
      def __init__(self,n):
          self.__name = n
      #设置 name 属性值的函数
      def setname(self,n):
          self.__name = n
      #访问nema属性值的函数
      def getname(self):
          return self.__name
      #删除name属性值的函数
      def delname(self):
          self.__name="xxx"
      #为name 属性配置 property() 函数
      name = property(getname, setname, delname, '指明出处')
  #调取说明文档的 2 种方式
  #print(CLanguage.name.__doc__)
  help(CLanguage.name)
  clang = CLanguage("C语言中文网")
  #调用 getname() 方法
  print(clang.name)
  #调用 setname() 方法
  clang.name="Python教程"
  print(clang.name)
  #调用 delname() 方法
  del clang.name
  print(clang.name)
  运行结果为:
  Help on property:
 
      指明出处
 
  C语言中文网
  Python教程
  xxx
 
  注意,在此程序中,由于 getname() 方法中需要返回 name 属性,如果使用 self.name 的话,其本身又被调用 getname(),这将会先入无限死循环。为了避免这种情况的出现,程序中的 name 属性必须设置为私有属性,即使用 __name(前面有 2 个下划线)。
  有关类属性和类方法的属性设置(分为共有属性、保护属性、私有属性),后续章节会做详细介绍。
 
  当然,property() 函数也可以少传入几个参数。以上面的程序为例,我们可以修改 property() 函数如下所示
  name = property(getname, setname)
  这意味着,name 是一个可读写的属性,但不能删除,因为 property() 函数中并没有为 name 配置用于函数该属性的方法。也就是说,即便 CLanguage 类中设计有 delname() 函数,这种情况下也不能用来删除 name 属性。
 
  同理,还可以像如下这样使用 property() 函数:
  纯文本复制
  name = property(getname)    # name 属性可读,不可写,也不能删除
  name = property(getname, setname,delname)    #name属性可读、可写、也可删除,就是没有说明文档

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!