首页 > 编程语言 >python @property装饰器实现原理

python @property装饰器实现原理

时间:2023-08-22 11:56:03浏览次数:56  
标签:__ fset python self instance def property 装饰 fget

@property装饰器可以使一个对象的方法变成属性访问, 比较方便, 那么它是如何实现的呢? 下面是一个自己动手实现的例子:

class MyProperty:
    def __init__(self, fget=None, fset=None):
        self.fget = fget
        self.fset = fset

    def __get__(self, instance, owner):
        if instance is None:
            return self
        if self.fget is None:
            raise AttributeError("unreadable attribute")
        return self.fget(instance)

    def __set__(self, instance, value):
        if self.fset is None:
            raise AttributeError("can't set attribute")
        self.fset(instance, value)

    def getter(self, fget):
        return type(self)(fget, self.fset)

    def setter(self, fset):
        return type(self)(self.fget, fset)

class MyClass:
    def __init__(self):
        self._x = 88

    @MyProperty
    def x(self):	# 运行到此处, 会生成一个名字为x, 类型为MyProperty的对象, 对象的fget为MyClass.x函数
        return self._x

    @x.setter
    def x(self, value):	# 此处会调用x对象的setter方法, 重新生成一个x对象, 此时x对象就同时拥有fget和fset方法了
        self._x = value

a = MyClass()
a.x = 99	# 会调用MyProperty对象的__set__方法, 并把a作为instance传递进去
print(a.x)  # 99

通过单步跟踪函数的执行过程, 可以搞明白函数的实现原理. 参考代码中注释.

标签:__,fset,python,self,instance,def,property,装饰,fget
From: https://www.cnblogs.com/huzhongqiang/p/17648104.html

相关文章

  • python的几种常用用法(掌握)
    Python常用的自动化小脚本,必须收藏!原创 鬼仔 码农鬼仔 2023-08-1918:00 发表于广东前言大家好,我是鬼仔。今天给大家分享几个python常用的自动化小脚本。无论是日常生活,还是工作开发,这几个脚本都常常会用到!1. List转JSON、String转JSON2. 时间格式转换3.......
  • python 多线程
    在python中,I/O密集型任务可以用多线程的方式来实现(threading库);然而,对于计算密集型任务,由于python中全局锁GIL的存在,多线程并不能起到一个加速的作用。所以此时,一般使用多进程的方式实现(multiprocessing库)。多线程threading:一个人有与异性聊天和看剧两件事要做。单线程的她可......
  • Lnton羚通云算力平台如何在OpenCV-Python 中,来进行图像算术运算?
    在OpenCV-Python中,可以使用函数cv2.add()、cv2.subtract()、cv2.multiply()和cv2.divide()来进行图像算术运算。这些函数接受两个输入图像,并对其进行逐像素的运算。1.图像加法:OpenCV 是饱和运算(大于255算255),NumPy 是模运算(大于255会与256进行求模)。importnumpyasnpimpo......
  • Python中字符串截取
    #截取字符串时,如果位数不够,Python不会报错,而是返回空字符串#这是因为Python中的字符串是不可变的,所以当我们尝试访问一个不存在的索引时,Python会返回空字符串而不是报错#示例代码s='hello'print(s[10:15])#返回空字符串'' #Python中的字符串是不可变的,这意味着一旦......
  • vscode 配置 python black 格式化单行长度
    配置信息vscode版本1.81.1vscode安装BlackFormatter插件问题默认Black格式化之后单行长度太短,需要通过修改配置文件解决。方法Ctrl+Shift+p,打开settings.json,添加一个black-formatter.args配置项,如下所示:"black-formatter.args":["--line-le......
  • python 外部文件调用Django程序操作model
    importosimportdjango#设置Django配置文件文件夹所在位置,并进行系统环境配置os.environ.setdefault("DJANGO_SETTINGS_MODULE","项目配置文件夹名称.settings")#加载Django模块,初始化Django环境django.setup()#导入需要调用的modelfrom应用名称.modelsimport......
  • python 打印一个条形图?
    背景在python中,使用matplot生成图表是一个很常用的方法,但在一些轻量级需求场合,例如仅做一个打印预览,或者快速查看,这些场景下调用matplot生成图表,略显繁琐。今天介绍一个通过 DebugInfo 模块打印条形图的方法,简单实用。引入模块pipinstallDebugInfo打印销售转化数据下面的......
  • 搭建Python⾃带静态Web服务器
    说明Python自带的静态Web服务器可以通过使用http.server模块来实现。步骤打开命令行终端,进入要作为静态文件根目录的文件夹。运行以下命令启动静态Web服务器:Python2.x版本:python-mSimpleHTTPServer<port>Python3.x版本:python-mhttp.server<port> <port>是可选参......
  • Python中的 if __name__ == “__main__“
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • python设置全局热键
    需要使用第三方库,代码如下:importtkinterastkimportkeyboarddefoutput(event):#print("Fromglobalkeystroke")print(event)root=tk.Tk()root.withdraw()keyboard.add_hotkey('ctrl+a',output,args=('Fromglobalkeystroke'......