property装饰器的描述器实现

本文深入探讨了Python中基于描述器的@property装饰器实现。通过官方文档的模拟源码,分析了描述器的工作原理,包括初始化、对象创建及属性操作等关键步骤。文章还提醒读者注意@property使用时可能遇到的小陷阱,并提供了扩展内容和相关学习资源。
摘要由CSDN通过智能技术生成


引言

在Python官方文档中的 描述器使用指南 一篇中,给出了常用装饰器 property 的Python代码模拟实现,且这个实现是基于描述器原理的。
在本文中,作者将利用这段代码,向你展示描述器的实际运行原理


装饰器基本内容

首先我们回忆一下装饰器的有关内容。

装饰器本质是个返回函数的函数,表现为数学概念中的复合函数 (g o f)(x) -> g(f(x))

下面我们用伪代码再补充一些容易产生疑问的情况。

多层装饰器的含义

@dec2
@dec1
def func(arg1, arg2, ...):
    pass

↑↑↑ 等价于 ↓↓↓

func = dec2(dec1(func))

带参装饰器的含义

@decomaker(argA, argB, ...)
def func(arg1, arg2, ...):
    pass

↑↑↑ 等价于 ↓↓↓

func = decomaker(argA, argB, ...)(func)

类装饰器和函数装饰器是一致的,只相当于将 func 代表的函数换做 cls 代表的类罢了,故这里不再多做涉及。

如果对于装饰器还有问题的话建议阅读一下官方PEP,可以使用Google翻译,效果还是不错的。
PEP 318 – Decorators for Functions and Methods
PEP 3129 – Class Decorators


描述器基本内容

这里推荐我针对描述器撰写的上一篇博文 Python描述器学习指南


官方模拟的源码

我们首先看一下用描述器模拟实现装饰器 property 的源代码。

(这里大概看一下就好,我们后文再详细分析)

class Property:
    "Emulate PyProperty_Type() in Objects/descrobject.c"

    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        if doc is None and fget is not None:
            doc = fget.__doc__
        self.__doc__ = doc

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

    def __set__(self, obj, value):
        if self.fset is None:
            raise AttributeError
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值