gpt4 book ai didi

python - 在 Python 中,如何从类方法的返回值中初始化类属性?

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:35 25 4
gpt4 key购买 nike

假设我们有这个类:

class Custom:
@classmethod
def get_choices(cls):
# use cls attributes to return a list

mapping = {"key": ... }

我想将 get_choices() 返回的值关联到 key。应该用什么代码代替占位符 ...


编辑: 我想让问题与上下文无关(在我看来,这个要求很常见,但我可能有偏见)。正如评论中所建议的那样,我将提供更多细节,因为我们似乎共同关注“最直接的代码”:

我正在开发一个 Django 应用程序,我想在其中将值的枚举 与使用它们的Model 分开。在我看来,一个自然的解决方案是创建一个 enumeration.py 模块,然后我可以在其中为每个枚举定义一个 class(该类至少有一个类方法生成值的集合)。这是示例中的 get_choices()

现在,由于业务逻辑,我需要将这些选择映射到一个键。这种映射在逻辑上与枚举耦合,将它们放在同一个类中似乎是一个很好的结构(为客户端代码提供统一和显式访问,以类名为前缀)。

最佳答案

你不能在类定义中这样做,因为类对象还没有被创建。在类定义之后,你绝对可以做这样的事情——

Custom.mapping['key'] = Custom.get_choices()

虽然推荐的方法是使用元类。

class CustomMetaClass(type):

def __init__(cls, classname, bases, attrs):
super(CustomMetaClass, cls).__init__(classname, bases, attrs)

cls.mapping['key'] = cls.get_choices()

class Custom(metaclass = CustomMetaClass): # assuming you are using python 3

mapping = {}

@classmethod
def get_choices(cls):
# add your custom code here
pass

话虽如此,这是针对该问题的面向对象解决方案。您当然可以使用一些函数来生成选择,从而结束使用元类的需要。

对于已编辑的问题:-

在那种情况下,我认为您应该按照您自己的建议维护一个名为“choices.py”的文件,并在您的映射中使用它们,而不是 get_choices 类方法。如果您只想存储选择,则无需为每个模型创建不必要的类。只需使用字典和常量。

如果您的类需要动态生成,比如从数据库生成,那么您需要创建单独的模型来存储选择。

class CustomModelChoices(models.Model):

model_name = models.StringField(db_field = 'mn')
choices = models.DictField(db_field = 'ch')

class CustomModel(models.Model):

_choice_generator = CustomModelChoices

mapping = {
'key': CustomModelChoices.objects.get(model_name = 'CustomModel').choices
}

这只是一个原始设计,可能需要进行大量改进,但在这些方面有所改进。

关于python - 在 Python 中,如何从类方法的返回值中初始化类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32091352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com