Python3.6内置函数(51)——property()

论坛 期权论坛 期权     
数据之魅   2019-7-28 23:17   3396   0

英文文档
  • class
    1. property
    复制代码
    (fget=None, fset=None, fdel=None, doc=None)
    Return a property attribute.
    fget is a function for getting an attribute value.  fset is a function
    for setting an attribute value. fdel is a function for deleting an attribute
    value.  And doc creates a docstring for the attribute.
property()
class property(fget=None, fset=None, fdel=None, doc=None) 标示属性的装饰器。
1、property是一个类,其作用是用来包装类的属性,这个属性可以根据实际需要,控制是否可读(设置fget参数)、可写(设置fset参数)、可删除(设置fdel参数)。
  1. class C:
复制代码
  1.     def __init__(self):
复制代码
  1.         self._x = '_x in C'
复制代码
  1.     def getx(self):
复制代码
  1.         return self._x
复制代码
  1.     def setx(self, value):
复制代码
  1.         self._x = value
复制代码
  1.     def delx(self):
复制代码
  1.         del self._x
复制代码
  1.     x = property(getx, setx, delx, "I'm the 'x' property.")
复制代码
  1. [/code][code]>>> c = C()
复制代码
  1. >>> c.x # 调用 getx
复制代码
  1. '_x in C'
复制代码
  1. [/code][code]>>> c.x = 'x had changed' # 调用 setx
复制代码
  1. >>> c.x # 调用 getx
复制代码
  1. 'x had changed'
复制代码
  1. [/code][code]>>> del c.x  # 调用 delx
复制代码
  1. >>> c.x # 调用 getx
复制代码
  1. Traceback (most recent call last):
复制代码
  1.   File "", line 1, in
复制代码
  1.     c.x
复制代码
  1.   File "", line 6, in getx
复制代码
  1.     return self._x
复制代码
  1. AttributeError: 'C' object has no attribute '_x'
复制代码
2. 参数doc表示的是属性的说明,如果没有指定,将从fget参数指定的方法中读取
  1. >>> print(1,2,3,'+','=?')
复制代码
  1. 1 2 3 + =?
复制代码
3、sep和end参数必须是字符串;或者为None,为None时意味着将使用其默认值。
  1. >>> help(c)
复制代码
  1. Help on C in module __main__ object:
复制代码
  1. [/code][code]class C(builtins.object)
复制代码
  1. |  Methods defined here:
复制代码
  1. |  
复制代码
  1. |  __init__(self)
复制代码
  1. |      Initialize self.  See help(type(self)) for accurate signature.
复制代码
  1. |  
复制代码
  1. |  delx(self)
复制代码
  1. |  
复制代码
  1. |  getx(self)
复制代码
  1. |  
复制代码
  1. |  setx(self, value)
复制代码
  1. |  
复制代码
  1. |  ----------------------------------------------------------------------
复制代码
  1. |  Data descriptors defined here:
复制代码
  1. |  
复制代码
  1. |  __dict__
复制代码
  1. |      dictionary for instance variables (if defined)
复制代码
  1. |  
复制代码
  1. |  __weakref__
复制代码
  1. |      list of weak references to the object (if defined)
复制代码
  1. |  
复制代码
  1. |  x
复制代码
  1. |      I'm the 'x' property.
复制代码
  1. [/code][code]# 最后一行中 文档字符串 为I'm the 'x' property.
复制代码
  1. [/code][code]>>> class C:
复制代码
  1.     def __init__(self):
复制代码
  1.         self._x = '_x in C'
复制代码
  1.     def getx(self):
复制代码
  1.         """I'm the 'x' property. provide by getx"""
复制代码
  1.         return self._x
复制代码
  1.     def setx(self, value):
复制代码
  1.         self._x = value
复制代码
  1.     def delx(self):
复制代码
  1.         del self._x
复制代码
  1.     x = property(getx, setx, delx)
复制代码
  1.    
复制代码
  1. >>> help(C)
复制代码
  1. Help on class C in module __main__:
复制代码
  1. [/code][code]class C(builtins.object)
复制代码
  1. |  Methods defined here:
复制代码
  1. |  
复制代码
  1. |  __init__(self)
复制代码
  1. |      Initialize self.  See help(type(self)) for accurate signature.
复制代码
  1. |  
复制代码
  1. |  delx(self)
复制代码
  1. |  
复制代码
  1. |  getx(self)
复制代码
  1. |      I'm the 'x' property. provide by getx
复制代码
  1. |  
复制代码
  1. |  setx(self, value)
复制代码
  1. |  
复制代码
  1. |  ----------------------------------------------------------------------
复制代码
  1. |  Data descriptors defined here:
复制代码
  1. |  
复制代码
  1. |  __dict__
复制代码
  1. |      dictionary for instance variables (if defined)
复制代码
  1. |  
复制代码
  1. |  __weakref__
复制代码
  1. |      list of weak references to the object (if defined)
复制代码
  1. |  
复制代码
  1. |  x
复制代码
  1. |      I'm the 'x' property. provide by getx
复制代码
  1. [/code][code]# 最后一行中 文档字符串 为 I'm the 'x' property. provide by getx
复制代码
  1. [/code]3. property更优雅的做法是用作装饰器,装饰过的方法就可以以属性方式调用。同时将生成.setter和.deleter装饰器,用于指定可入方法,删除方法
  2. [list][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list][code]>>> class C:
复制代码
  1.     def __init__(self):
复制代码
  1.         self._x = '_x in C'
复制代码
  1.     @property
复制代码
  1.     def x(self):
复制代码
  1.         """I'm the 'x' property."""
复制代码
  1.         return self._x
复制代码
  1.     @x.setter
复制代码
  1.     def x(self, value):
复制代码
  1.         self._x = value
复制代码
  1.     @x.deleter
复制代码
  1.     def x(self):
复制代码
  1.         del self._x
复制代码
  1. [/code][code]>>> c = C()
复制代码
  1. >>> c.x # 调用 getx
复制代码
  1. '_x in C'
复制代码
  1. [/code][code]>>> c.x = 'x had changed' # 调用 setx
复制代码
  1. >>> c.x # 调用 getx
复制代码
  1. 'x had changed'
复制代码
  1. [/code][code]>>> del c.x  # 调用 delx
复制代码
  1. >>> c.x # 调用 getx
复制代码
  1. Traceback (most recent call last):
复制代码
  1.   File "", line 1, in
复制代码
  1.     c.x
复制代码
  1.   File "", line 6, in getx
复制代码
  1.     return self._x
复制代码
  1. AttributeError: 'C' object has no attribute '_x'
复制代码
4. 不直接使用字段,而使用属性,主要因为可以控制外部对类字段的恶意修改和删除,而且可以再设置属性值的时候进行适当的验证。
  1. >>> class C:
复制代码
  1.     def __init__(self):
复制代码
  1.         self._name = ''
复制代码
  1.     @property
复制代码
  1.     def name(self):
复制代码
  1.         """i'm the 'name' property."""
复制代码
  1.         return self._name
复制代码
  1.     @name.setter
复制代码
  1.     def name(self,value):
复制代码
  1.         if value is None:
复制代码
  1.             raise RuntimeError('name can not be None')
复制代码
  1.         else:
复制代码
  1.             self._name = value
复制代码
  1. [/code][code]>>> c = C()
复制代码
  1. [/code][code]>>> c.name # 访问属性
复制代码
  1. ''
复制代码
  1. >>> c.name = None # 设置属性时进行验证
复制代码
  1. Traceback (most recent call last):
复制代码
  1.   File "", line 1, in
复制代码
  1.     c.name = None
复制代码
  1.   File "", line 11, in name
复制代码
  1.     raise RuntimeError('name can not be None')
复制代码
  1. RuntimeError: name can not be None
复制代码
  1. [/code][code]>>> c.name = 'Kim' # 设置属性
复制代码
  1. >>> c.name # 访问属性
复制代码
  1. 'Kim'
复制代码
  1. [/code][code]>>> del c.name # 删除属性,不提供deleter则不能删除
复制代码
  1. Traceback (most recent call last):
复制代码
  1.   File "", line 1, in
复制代码
  1.     del c.name
复制代码
  1. AttributeError: can't delete attribute
复制代码
  1. >>> c.name
复制代码
  1. 'Kim'
复制代码
小结
希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,希望你留言和我进行交流、讨论。

欢迎关注微信公众号,访问更多精彩:数据之魅

如需转载,请联系授权,谢谢合作。




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP