lat*_*oda 6 python-3.x python-dataclasses
我想限制数据类实例的最大数量,并知道实例的索引。这是我想要的行为:
Veget('tomato', 2.4, 5)
Veget('salad', 3.5, 2)
Veget('carot', 1.2, 7)
for Veget in Veget.instances:
print(Veget)
Run Code Online (Sandbox Code Playgroud)
Veget(index=0, name='tomato', price=2.4, quantity=5)
Veget(index=1, name='salad', price=3.5, quantity=2)
Veget(index=2, name='carot', price=1.2, quantity=7)
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,该方法确实可以处理创建限制:
Veget('tomato', 2.4, 5)
Veget('salad', 3.5, 2)
Veget('carot', 1.2, 7)
for Veget in Veget.instances:
print(Veget)
Run Code Online (Sandbox Code Playgroud)
但打印时不会显示索引:
Veget(name='tomato', price=2.4, quantity=5)
Veget(name='salad', price=3.5, quantity=2)
Veget(name='carot', price=1.2, quantity=7)
Run Code Online (Sandbox Code Playgroud)
对数据类进行隐式限制或要求某种验证通常是通过指定__post_init__而不是使用对象继承来实现的。利用它的实现可能如下所示,在我看来,这更容易维护和理解:
from dataclasses import dataclass, field
MAX_COUNT = 3
VEGET_INDEX = []
@dataclass
class Veget:
index: int = field(init=False)
name: str
price: float
quantity: int
def __post_init__(self):
self.index = len(VEGET_INDEX)
if self.index >= MAX_COUNT:
raise RuntimeError("Too many instances")
VEGET_INDEX.append(self)
Run Code Online (Sandbox Code Playgroud)
您还可以使用计数器而不是在初始化后例程中递增的列表,但引用列表似乎对于调试目的很方便。无论如何,创建三个允许的实例并尝试创建第四个实例将如下所示:
from dataclasses import dataclass, field
MAX_COUNT = 3
VEGET_INDEX = []
@dataclass
class Veget:
index: int = field(init=False)
name: str
price: float
quantity: int
def __post_init__(self):
self.index = len(VEGET_INDEX)
if self.index >= MAX_COUNT:
raise RuntimeError("Too many instances")
VEGET_INDEX.append(self)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |