【问题标题】:Is it possible to specialize an object to a subclass on the fly?是否可以动态地将对象专门化为子类?
【发布时间】:2020-02-03 09:59:10
【问题描述】:

我目前的情况是,我有一个类 (Item) 和一个子类 (ScoredItem) 以及一个将 Item 变为 ScoredItem 的函数。代码工作正常,但它需要我重新创建现有对象。 Item 可能会获得另一个具有默认值的属性,这会破坏代码。例如,如果Item 有一个属性total_interactions : int = 0,那么插入score_items 的项目列表可能没有total_interactions=0。但是如果score_items没有被调整,那么它就会默默地失败。有没有办法防止这种情况?像scored_item = ScoredItem(score=0.123, **item) 这样的东西?还是item.score = 0.123; scored_item = ScoredItem(item)

我想过composition vs. inheritance,但是有很好的指标应该是继承。

MVCE

import random
from typing import List

from pydantic import BaseModel


class Item(BaseModel):
    item_id: str
    title: str


class ScoredItem(Item):
    score: float


def get_items() -> List[Item]:
    # generate n random items
    n = 10
    return [Item(item_id=str(i), title="foobar") for i in range(n)]


def score_items(items: List[Item]) -> List[ScoredItem]:
    scored_items = []
    for item in items:
        scored_item = ScoredItem(
            # Everything an Item has
            item_id=item.item_id, title=item.title,
            # Plus the score
            score=random.random()
        )
    return scored_items


items = get_items()
scored_items = score_items(items)

【问题讨论】:

  • 为什么不使用scored_item = ScoredItem(score=0.123, **item.dict())
  • 这可能有效:-) - pydantics .dict() 是否保证只有构造函数中的东西/具有每个属性?
  • 我认为每个属性,仅在一小时前从这篇文章中了解到 pydantic :)
  • 它需要参数来更改返回的内容,请参阅文档。

标签: python python-3.x pydantic


【解决方案1】:

除非我遗漏了你需要的东西ScoredItem(score=0.123, **dict(item))

或者您可以使用item.dict(),有关差异的详细信息,请参阅here

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 2020-01-09
    • 2021-08-18
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多