首页 > 解决方案 > 在数据类中使用类或静态方法作为 default_factory

问题描述

我想使用该default_factory方法填充数据类的属性。然而,由于工厂方法只在这个特定类的上下文中有意义,我想将它保留类中(例如作为静态或类方法)。例如:

from dataclasses import dataclass, field
from typing import List

@dataclass
class Deck:
    cards: List[str] = field(default_factory=self.create_cards)

    @staticmethod
    def create_cards():
        return ['King', 'Queen']

但是,我在第 6 行收到此错误(如预期的那样):

NameError:名称“自我”未定义

我该如何克服这个问题?我不想将该create_cards()方法移出课堂。

标签: pythonpython-dataclasses

解决方案


一种可能的解决方案是将其移至__post_init__(self). 例如:

@dataclass
class Deck:
    cards: List[str] = field(default_factory=list)

    def __post_init__(self):
        if not self.cards:
            self.cards = self.create_cards()

    def create_cards(self):
        return ['King', 'Queen']

输出:

d1 = Deck()
print(d1) # prints Deck(cards=['King', 'Queen'])
d2 = Deck(["Captain"])
print(d2) # prints Deck(cards=['Captain'])

推荐阅读