作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何将值从基础数据类升级到继承自它的值?
示例(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')
返回 random_stranger "Person(name='Bob', smell='OK')"
如何将随机的陌生人变成 friend ?
Friend(random_stranger)
返回“Friend(name=Person(name='Bob', smell='OK'), smell='good')”
我想得到“Friend(name='Bob', smell='OK')”作为结果。
Friend(random_stranger.name, random_stranger.smell)
有效,但如何避免必须复制所有字段?
或者我可能无法在从数据类继承的类上使用@dataclass 装饰器?
最佳答案
你要的是factory method pattern实现的,并且可以使用 @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] 如果您的子类引入没有默认值的新字段,您尝试从子类实例创建父类实例,或者您的父类具有仅初始化参数,则它将不起作用.
关于Python:从基本数据类继承的数据类,如何将值从基类升级到新类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54824893/
我是一名优秀的程序员,十分优秀!