【发布时间】:2021-07-22 19:46:30
【问题描述】:
背景
在 python 中,descriptor 是一个定义__get__、__set__ 或__delete__ 的对象,有时还定义__set_name__。 python中描述符最常见的用法可能是property(getter, setter, deleter, description)。当调用相应的描述符方法时,属性描述符会调用给定的 getter、setter 和 deleter。
有趣的是,函数也是描述符:它们定义__get__,当调用它时,会返回一个绑定方法。
描述符用于修改访问对象属性时发生的情况。例如限制访问、记录对象访问,甚至是从数据库中动态查找。
问题
我的问题是:如何设计可组合的描述符?
例如:
假设我有一个 Restricted 描述符(仅在满足某种条件时允许设置和获取)和一个 AccessLog 描述符(每次属性为“设置”或“获取”时记录) .我可以设计它们以便在使用它们时组合它们的功能吗?
假设我的示例用法如下所示:
class ExampleClient:
# use them combined, preferably In any order
# (and there could be a special way to combine them,
# although functional composition makes the most sense)
foo: Restricted(AccessLog())
bar: AccessLog(Restricted())
# and also use them separately
qux: Restricted()
quo: AccessLog()
我正在寻找一种将其变为可重用模式的方法,因此我可以使任何描述符可组合。关于如何以pythonic方式执行此操作的任何建议?我将自己尝试一些想法,看看有什么效果,但我想知道这是否已经尝试过,是否有某种“最佳实践”或此类事情的通用方法......
【问题讨论】: