在 dataclasses 中使用 class 或静态方法作为 default_factory
Using class or static method as default_factory in dataclasses
我想使用 default_factory
方法填充数据 class 的属性。但是,由于工厂方法仅在这个特定的 class 的上下文中有意义,我想将它保留在 内部 class 中(例如作为静态或 class 方法)。例如:
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: name 'self' is not defined
我该如何克服这个问题?我不想将 create_cards()
方法移出 class.
一种可能的解决方案是将其移动到 __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'])
我想使用 default_factory
方法填充数据 class 的属性。但是,由于工厂方法仅在这个特定的 class 的上下文中有意义,我想将它保留在 内部 class 中(例如作为静态或 class 方法)。例如:
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: name 'self' is not defined
我该如何克服这个问题?我不想将 create_cards()
方法移出 class.
一种可能的解决方案是将其移动到 __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'])