576*_*76i 11 python python-3.7 python-dataclasses
如何将值从基础数据类升级到继承自它的数据类?
示例(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()
Run Code Online (Sandbox Code Playgroud)
打印“嗨亚历克斯”
random_stranger = Person(name = 'Bob', smell='OK')
Run Code Online (Sandbox Code Playgroud)
返回 random_stranger "Person(name='Bob',sole='OK')"
如何将 random_stranger 变成朋友?
Friend(random_stranger)
Run Code Online (Sandbox Code Playgroud)
返回“朋友(姓名=人(姓名='鲍勃',气味='OK'),气味='好')”
结果我想得到“朋友(名字=“鲍勃”,气味=“OK”)”。
Friend(random_stranger.name, random_stranger.smell)
Run Code Online (Sandbox Code Playgroud)
有效,但如何避免必须复制所有字段?
或者我是否可能无法在从数据类继承的类上使用 @dataclass 装饰器?
Arn*_*rne 11
您所要求的是由工厂方法模式实现的,并且可以使用@classmethod关键字直接在 python 类中实现。
只需在基类定义中包含一个数据类工厂方法,如下所示:
import dataclasses
@dataclasses.dataclass
class Person:
name: str
smell: str = "good"
@classmethod
def from_instance(cls, instance):
return cls(**dataclasses.asdict(instance))
Run Code Online (Sandbox Code Playgroud)
任何从这个基类继承的新数据类现在都可以像这样创建彼此的实例[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"
Run Code Online (Sandbox Code Playgroud)
[1]如果您的子类引入了没有默认值的新字段,您尝试从子类实例创建父类实例,或者您的父类具有 init-only 参数,则它将不起作用。
| 归档时间: |
|
| 查看次数: |
8099 次 |
| 最近记录: |