python - 使用不同的对象类型作为参数初始化 python 对象
问题描述
我已经阅读了如何重载...以及python 中的多个构造函数以及有关此主题的更多内容,但是我正在寻找更具体的内容。
我得到了一个Content
对象列表和一个Data
对象列表:
class Content:
def __init__(self):
self._title = 'movie title'
self._url = 'http://movie-url'
@property
def title(self):
return self._title
@property
def url(self):
return self._url
class Data:
def __init__(self):
self._title = 'movie title'
self._year = 2021
self._rating = 7.6
@property
def title(self):
return self._title
@property
def year(self):
return self._year
@property
def rating(self):
return self._rating
我想通过 title 属性将每个对象Content
与它对应的内容进行匹配,并通过将其他对象之一传递给's init 参数来组合一个类下的所有内容:Data
Movie
Movie
movie_content = Movie(Content())
movie_data = Movie(Data())
从我目前所读到的内容来看,我的选择是:
- 默认参数:似乎不适合这里(如果我错了,请纠正我),因为无论如何我只想传递一个参数。
*args
: 我宁愿避免传递一长串参数(至少有 12 个)。@classmethod
:这种方法对我最有吸引力,但我正在努力实现:
class Movie:
def __init__(self, object):
self.object = object
@classmethod
def by_content(cls, content):
_title = content.title
_url = content.url
return cls( # what goes here?)
@classmethod
def by_data(cls, data):
_title = data.title
_year = data.year
_rating = data.rating
return cls( # what goes here?)
- 使用方法作为多设置器,我目前正在使用(据我了解,这不是最 Pythonic):
class Movie:
def __init__(self):
self._title = ''
self._url = ''
self._year = 0
self._rating = 0.0
def by_content(self, content):
self._title = content.title
self._url = content.url
def by_data(self, data):
self._title = data.title
self._year = data.year
self._rating = data.rating
任何想法或建议将不胜感激。
解决方案
您可以使用classmethod
s 作为辅助构造函数 - 您将使用函数中第二个参数的值来填写Movie
类构造函数中的属性。
我使用dataclass
es 制作了示例,因为这使代码更短,具有相同的功能。(或者更多)
from dataclasses import dataclass
@dataclass
class Content:
title: str
url: str
@dataclass
class Data:
title: str
year: str
rating: float
@dataclass
class Movie:
title: str
year: str
rating: float
url: str
@classmethod
def by_content(cls, content: Content): return cls(
title = content.title,
url = content.url,
rating = 0,
year = 0,
)
@classmethod
def by_content(cls, data: Data): return cls(
title = data.title,
url = 'https://null.com',
rating = data.rating,
year = data.year,
)
推荐阅读
- doctrine-orm - symfony 4.4:日期时间必须是字符串?
- swift - 如何从索引中获取索引为 Int?在字典斯威夫特
- javascript - 在 javascript 的不同函数中使用 JSON 对象
- asp.net-core - 针对 MediatR 中缺少的查询/命令实现的构建/测试验证
- swift - VPN 在 Mac Catalyst 上不工作 SecKeychainItemCopyContent 返回 无法检索此项目的内容
- python - 带有 OOP 方法的 Tkinter 回调
- java - 如何跟踪独立应用程序的所有 http 流量
- java - Android Studio 从 html 获取数据并仅过滤一些值以在 textView 上显示
- reactjs - 从数据库而不是浏览器 i18next 获取语言环境
- c# - 在 splitviewcontroller 中激活另一个视图控制器