Python装饰器中@property使用详解

作者:小朋友2D 时间:2022-04-22 04:46:44 

最初的声明方式

在没有@property修饰的情况下,需要分别声明get、set、delete函数,然后初始化property类,将这些方法加载进property中

class C持有property的实例化对象x

对外表现出来C().x时,实际上是调用C()中的x(property类)中设置的fset,fget,fdel,分别对应getx,setx,delx

C真正持有的x,是self._x被隐藏起来了

class C(object):
   def getx(self):
       return self._x

def setx(self, value):
       self._x = value

def delx(self):
       del self._x

x = property(getx, setx, delx, "I'm the 'x' property.")

property类 结合x = property(getx, setx, delx, "I'm the 'x' property.")与property的__init__()可以发现property接受四个参数

fget,用于获取属性值,

fset,用于设置属性值

fdel,用于删除属性

doc,属性的介绍

可以单独设置fget、fset、fdel…

x = property,x.getter(getx),x.setter(setx),x.deleter(delx)

class property(object):

def deleter(self, *args, **kwargs): # real signature unknown
       """ Descriptor to change the deleter on a property. """
       pass

def getter(self, *args, **kwargs): # real signature unknown
       """ Descriptor to change the getter on a property. """
       pass

def setter(self, *args, **kwargs): # real signature unknown
       """ Descriptor to change the setter on a property. """
       pass

def __delete__(self, *args, **kwargs): # real signature unknown
       """ Delete an attribute of instance. """
       pass

def __getattribute__(self, *args, **kwargs): # real signature unknown
       """ Return getattr(self, name). """
       pass

def __get__(self, *args, **kwargs): # real signature unknown
       """ Return an attribute of instance, which is of type owner. """
       pass

def __init__(self, fget=None, fset=None, fdel=None, doc=None): # known special case of
       pass

使用装饰器的声明方式

需要注意,装饰器只是一个python的语法糖,可以拆解成普通使用方法,如property(getx)

@property创建了一个实例x,对于def x(self)实际上是C类持有x = property(fget=x)

因此,x.setter方法指向的是property.setter,也是起到装饰器效果x.setter(x)(注意,前者x是property实例x,后者x是def x(self, value)函数),x.deleter同理

class C(object):
   @property
   def x(self):
       "I am the 'x' property."
       return self._x

@x.setter
   def x(self, value):
       self._x = value

@x.deleter
   def x(self):
       del self._x

为什么property实例化后的名字与属性名一致?

换种问法就是为什么x = property(...)

可以认为是

attributes_and_methods = {
   x.__name__: property(x), //声明C类持有property实例
   #...
}
C = type('C', (object,), attributes_and_methods)

使用装饰器的调用过程

执行C().x时,调用的是C().x(property)绑定的fget方法,用过__get__唤醒,setter、deleter同理

class property(object):

#...
   def __init__(self, fget=None, fset=None, fdel=None, doc=None):
       self.fget = fget
       self.fset = fset
       self.fdel = fdel
       ...

def __get__(self, obj, objtype=None): # real signature unknown
       if obj is None:
           return self
       if self.fget is None:
           raise AttributeError("unreadable attribute")
       return self.fget(obj)

来源:https://blog.csdn.net/ct2020129/article/details/122681130

标签:python,装饰器,@property
0
投稿

猜你喜欢

  • 对pandas将dataframe中某列按照条件赋值的实例讲解

    2023-03-12 07:24:58
  • [Oracle] Data Guard CPU/PSU补丁安装详细教程

    2024-01-26 05:48:21
  • Python异常处理与反射相关问题总结

    2022-02-09 18:20:32
  • 详解javascript遍历方式

    2023-10-14 16:44:48
  • Refactoring HTML 书评

    2008-07-10 12:00:00
  • pandas数据集的端到端处理

    2023-01-20 04:48:43
  • linux环境下安装python虚拟环境及注意事项

    2023-12-09 08:02:47
  • Python爬虫框架Scrapy实战之批量抓取招聘信息

    2022-03-28 11:38:09
  • 在Python的Django框架中包装视图函数

    2021-01-08 03:45:45
  • python实现数值积分的Simpson方法实例分析

    2023-08-01 17:35:01
  • 仿6room网站图片链接效果

    2007-06-21 13:59:00
  • Python的bit_length函数来二进制的位数方法

    2022-06-25 00:35:58
  • Python数学建模库StatsModels统计回归简介初识

    2021-05-05 04:57:02
  • DBCC SHRINKDATABASEMS SQL数据库日志压缩方法

    2024-01-27 03:57:10
  • js RuntimeObject() 获取ie里面自定义函数或者属性的集合

    2024-04-22 13:06:34
  • JavaScript高级程序设计 阅读笔记(十五) 浏览器中的JavaScript

    2024-04-10 10:57:11
  • MySql 安装时的1045错误

    2024-01-21 23:02:47
  • 一文带你学会使用PHP接口

    2023-06-07 18:40:13
  • 基于Python制作B站视频下载小工具

    2023-11-18 11:58:50
  • Python入门教程(十四)Python的集合

    2022-11-29 21:21:09
  • asp之家 网络编程 m.aspxhome.com