惰性类属性装饰器

2023-12-03

我有一个 Django 模型,需要对自定义用户模型进行一些处理。

我无法在类加载时使用该模型的类,因为类的加载顺序未知。

所以我需要在运行时添加一些类属性,目前我将它们添加到__init__ or __new__ like:

def __new__(cls, *args, **kwargs):
    # hack to avoid INSTALLED_APPS initialization conflicts.
    # get_user_model() can't be called from this module at class loading time,
    # so some class attributes must be added later.
    # Metaclasses could me more appropiate but I don't want to override
    # dango's metaclasses.
    if not hasattr(cls, '_reverse_field_name_to_user'):
        cls._find_reverse_field_name_to_user()
    return Group.__new__(cls, *args, **kwargs)

它有效,但看起来很糟糕,所以我考虑过使用类似的东西@lazyclassproperty对于这些属性。

我找到了几个@classproperty and @lazyproperty装饰器,但不是一个同时适用于两者的装饰器,而且我不知道如何自己编写一个。

Question:我如何编写这样的装饰器?或者建议我当前愚蠢的实现的另一种更清洁的替代方案。


Pyramid 框架有一个非常好的装饰器,称为reify,但它只适用于实例级别,而您需要类级别,所以让我们稍微修改一下

class class_reify(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped
        try:
            self.__doc__ = wrapped.__doc__
        except: # pragma: no cover
            pass

    # original sets the attributes on the instance
    # def __get__(self, inst, objtype=None):
    #    if inst is None:
    #        return self
    #    val = self.wrapped(inst)
    #    setattr(inst, self.wrapped.__name__, val)
    #    return val

    # ignore the instance, and just set them on the class
    # if called on a class, inst is None and objtype is the class
    # if called on an instance, inst is the instance, and objtype 
    # the class
    def __get__(self, inst, objtype=None):
        # ask the value from the wrapped object, giving it
        # our class
        val = self.wrapped(objtype)

        # and set the attribute directly to the class, thereby
        # avoiding the descriptor to be called multiple times
        setattr(objtype, self.wrapped.__name__, val)

        # and return the calculated value
        return val

class Test(object):
    @class_reify
    def foo(cls):
        print("foo called for class", cls)
        return 42

print(Test.foo)
print(Test.foo)

运行程序并打印

foo called for class <class '__main__.Test'>
42
42
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

惰性类属性装饰器 的相关文章

随机推荐

  • 如何配置Json.NET自定义序列化?

    由于我无法控制的原因 我从外部服务返回的数据被格式化为字符串数组的数组 string one string two 我试图将其反序列化为具有两个属性的对象 public class MyObject public string Proper
  • ajax 调用导致错误而不是成功

    在我的 ASP net mvc3 项目中 我使用 ajax 调用将 json 数据发送到控制器公司中的创建操作方法 但是当我调试ajax调用时 它总是以错误结果而不是成功结果结束 阿贾克斯调用 ajax url Company Create
  • 在javascript中移动对象元素位置

    我正在尝试找到一种将对象元素移动到特定位置的方法 例如 我有这个对象 element1 object element2 element3 我搜索将 element3 移动到第一个位置 element3 element1 element2 感
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • 如何为等待函数调用添加超时

    向等待函数添加超时的最佳方法是什么 Example lets pretend this is in a library that I m using and I can t mess with the guts of this thing
  • 按平均值排名的箱线图

    我想显示多个变量的箱线图 并按列均值降序排列它们 就像在绩效分析包裹 我使用以下代码生成箱线图 zx lt replicate 5 rnorm 50 zx means lt colMeans zx na rm TRUE boxplot zx
  • django 和 facebook:代表用户执行第三方登录的 facebook web 应用程序的安全性和设计

    我正在编写一个 Facebook 画布 Web 应用程序 它执行对第三方网站的登录 使用 urllib 并代表用户执行操作 这意味着我有2个账户 用户在我的网络应用程序中拥有的帐户 通过 facebook 以及应用程序用来代表他们执行登录的
  • Android Parcelable 对象返回 Null

    我有产品类 我想将产品对象从一项活动传递到另一项活动 我已经这样实现了 public class Product implements Parcelable private double availableQuantity private
  • 函数修改列表

    def make Ab A b n len A Ab list A for index in range 0 n Ab index append b index 0 print A return Ab copy A 0 0 1 0 1 0
  • VSCode 片段触发器之前有文本吗?

    我想在 VSCode 中创建一个显示 PHP 箭头的代码片段 当我按 键然后按 TAB 键时 我想要 PHP 箭头 gt 这是我的代码片段 PHP arrow prefix body gt 0 description PHP Arrow g
  • R - 将数据帧转换为格式为 featureName:featureValue [重复] 的数据集

    这个问题在这里已经有答案了 原来我想要的格式叫 SVM 轻 并在这里描述http svmlight joachims org 我有一个数据框 我想将其转换为格式如下的文本文件 output featureIndex featureValue
  • 无法在子进程命令中使用 grep

    我的子进程命令有问题 我喜欢 grep 出与 Online 行匹配的行 def run command command p subprocess Popen command shell False stdout subprocess PIP
  • 如何处理 tokio::spawn 闭包需要“static”和“&self”?

    我无法理解如何编写封装在一个结构中的并发异步代码 我不确定如何准确解释这个问题 所以我会尝试用一个例子来解释 假设我有一个UdpServer结构 该结构有多个与其行为相关的方法 例如 handle datagram deserialize
  • 我们是否忽略补码的溢出

    我试图解决二进制补码内的溢出问题 例如说我试图去掉这两个二进制数 1111 1000 0100 010 111 001 000 我将第二个二进制数转换为两个补码等值 然后简单地将其相加 但我注意到它导致了 1 的溢出 我是否只是忽略溢出 或
  • 未找到 Python 模块,但该模块存在于文件夹中

    我正在尝试执行一个简单的 PY 文件 但收到以下错误 Traceback most recent call last File docker pull py line 8 in
  • Python 中可能存在混合缩进吗?

    看着this问题 我在我的机器上尝试了OP的代码 这里有一个文字版和截图 刚刚发生了什么 这应该是一个square功能 并且已正确实现 可以肯定的是 我复制粘贴了代码 然后再次尝试 好吧 我看不出这些版本之间有什么区别square 但只有后
  • 使用 clusplot 绘制以 0 为中心坐标的聚类

    我正在尝试绘制 GIS 坐标 特别是东向和北向相似的英国国家网格坐标 194630000 562220000 我可以使用 Cluster 库中的 clusplot 绘制这些图 clusplot df2 k means fit cluster
  • Javascript 函数生成具有非均匀概率的随机整数

    在javascript 或jquery 中 有一个简单的函数可以计算四个整数及其概率值 1 0 41 2 0 29 3 0 25 4 0 05 我怎样才能生成这四个数字并考虑到它们的概率 这个问题与这里发布的问题非常相似 生成具有概率的随机
  • php 5.3.1 的 phpinfo() 中未启用 mysql

    我在 Vista 上安装了 apache 2 2 14 php 5 3 1 和 mysql 5 1 43 两天以来我一直在尝试配置 php 以在 phpinfo 上启用 mysql 我修改了 php ini 使其具有 extension d
  • 惰性类属性装饰器

    我有一个 Django 模型 需要对自定义用户模型进行一些处理 我无法在类加载时使用该模型的类 因为类的加载顺序未知 所以我需要在运行时添加一些类属性 目前我将它们添加到 init or new like def new cls args