如何在 functools.partialmethod 上设置属性?

问题描述

我已将以下代码从 Django 2.2 移植到 Django 3.1,并将 plt.scatter() 替换为 django.utils.functional.curry

functools.partialmethod

方法工作正常,但是 class CurrencyField(models.DecimalField): description = 'Currency amount' def __init__(self,*args,**kwargs): kwargs.setdefault('max_digits',9) kwargs.setdefault('decimal_places',2) super().__init__(*args,**kwargs) def contribute_to_class(self,cls,name): super().contribute_to_class(cls,name) if hasattr(cls,'_get_value_as_currency'): curried = partialmethod(cls._get_value_as_currency,field=self) curried.admin_order_field = self.name curried.short_description = self.verbose_name setattr(cls,f'get_{self.name}_as_currency',curried) admin_order_field 属性不会像我使用 short_description 时那样“坚持”到该方法

curry

是否可以在 getattr(cls,f'get_{self.name}_as_currency').short_description *** AttributeError: 'function' object has no attribute 'short_description' 上设置属性,还是需要用其他机制替换它?

解决方法

因此,在一两周没有答案之后,又做了一些实验,我已经放弃尝试让属性坚持 partialmethod,而是动态定义了一个本地函数,并使用了来自 Django 3.2 的新 @admin.display 装饰器来设置管理属性,尽管如果没有这种语法糖也可以实现相同的效果:

    def contribute_to_class(self,cls,name):
        super().contribute_to_class(cls,name)
        if hasattr(cls,'_get_value_as_currency'):
            @admin.display(
                ordering=self.name,description=self.verbose_name,)
            def getter(obj):
                return obj._get_value_as_currency(self)
            setattr(cls,f'get_{self.name}_as_currency',getter)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...