python - Python:从基础Dataclass继承的Dataclass,如何将值从基础升级到新类?
问题描述
如何将值从基础数据类升级到继承自它的值?
示例(Python 3.7.2)
from dataclasses import dataclass
@dataclass
class Person:
name: str
smell: str = "good"
@dataclass
class Friend(Person):
# ... more fields
def say_hi(self):
print(f'Hi {self.name}')
friend = Friend(name='Alex')
f1.say_hi()
打印“嗨亚历克斯”
random_stranger = Person(name = 'Bob', smell='OK')
返回随机陌生人“人(名称='鲍勃',气味='OK')”
如何将 random_stranger 变成朋友?
Friend(random_stranger)
返回“朋友(姓名=人(姓名='鲍勃',气味='OK'),气味='好')”
结果我想得到“朋友(名字='鲍勃',气味='OK')”。
Friend(random_stranger.name, random_stranger.smell)
有效,但是如何避免复制所有字段?
还是我不能在从数据类继承的类上使用 @dataclass 装饰器?
解决方案
您所要求的是通过工厂方法模式@classmethod
实现的,并且可以使用关键字直接在python类中实现。
只需在基类定义中包含一个数据类工厂方法,如下所示:
import dataclasses
@dataclasses.dataclass
class Person:
name: str
smell: str = "good"
@classmethod
def from_instance(cls, instance):
return cls(**dataclasses.asdict(instance))
从此基类继承的任何新数据类现在都可以创建彼此的实例[1],如下所示:
@dataclasses.dataclass
class Friend(Person):
def say_hi(self):
print(f'Hi {self.name}')
random_stranger = Person(name = 'Bob', smell='OK')
friend = Friend.from_instance(random_stranger)
print(friend.say_hi())
# "Hi Bob"
[1]如果您的子类引入没有默认值的新字段,您尝试从子类实例创建父类实例,或者您的父类具有仅 init 参数,则它将不起作用。
推荐阅读
- node.js - setupProxy 不工作 - http-proxy-middleware
- java - Java:检查节点是否存在于链表中
- docusaurus - 版本化 Docusaurus 网站为其他语言返回 404
- answer-set-programming - 使用最大化时如何在 cligo 中显示所有最大结果?
- regex - 如何为以下条件编写正则表达式
- reactjs - *帮助*使用钩子将类转换为功能组件
- android - 无法设置 textView 值
- ffmpeg - filtergraph 描述中的流说明符不匹配任何流
- typescript - 用 Typescript 编写的 NPM 包 - 定义面向公众的 API
- assembly - x86 程序集:即使实现正确,交换函数的输出也不正确