![](/img/trans.png)
[英]When does Python fall back onto class __dict__ from instance __dict__?
[英]Update a class instance's __dict__ by another class instance
我有以下问题:我的 python 脚本 parses.pdf 文档并返回找到的订单信息作为此 class 的实例:
@dataclass
class BasicOrder:
order_id: str = ''
supplier_name: str = ''
supplier_order_id: str = ''
client_order_id: str = ''
base_name: str = ''
container_no: str = ''
seal_no: str = ''
但是,文档往往没有完整的订单信息,所以我必须查询数据库以查找是否有更多信息。
所以我最终得到了两个对象:BasicOrder class: order_from_pdf和order_from_db ,一个填充了一些属性(例如container_no
和seal_no
),另一个有order_id, supplier_name
等(从 pdf 和 db 中得知,可以非常随机因为不同的文件有不同的数据,并不总是正确填写)
最后,我必须将它们“粉碎”成一个完整的 object,我使用这个 function:
def update_dict(self, another_object_dict: dict):
for key, value in self.__dict__.items():
if not value and another_object_dict[key]:
self.__dict__[key] = another_object_dict[key]
这是一个问题:我可以以某种方式传递另一个 object 实例而不是dict吗? 如果将其用作参数,它会给我Unresolved reference 'BasicOrder'
。
或者也许有更“干净”的方式来做到这一点?
您可以使用数据类中的asdict
function 而不是__dict__
来确保没有副作用。 这是一个小例子:
import dataclasses
from typing import Optional
@dataclasses.dataclass
class Foo:
attr_1: str
attr_2: Optional[int] = None
attr_3: Optional[str] = None
def combine_with_other(self, other: Foo) -> Foo:
attribute_dict_other = dataclasses.asdict(other)
attribute_dict_self = dataclasses.asdict(self)
merged_dict = {
key: attribute_dict_other[key] if attribute is None else attribute
for key, attribute in attribute_dict_self.items()
}
return Foo(**merged_dict)
这是 output:
>>> db_version = Foo("foo", attr_3="attr_3")
>>> local_version = Foo("foo", 42)
>>> print(local_version.combine_with_other(db_version))
Foo(attr_1='foo', attr_2=42, attr_3='attr_3')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.