使用不同的 object 类型作为参数初始化 python object
Initializing python object using different object types as arguments
我已经阅读了 how to overload... and multiple constructors in python 以及有关此主题的更多内容,但是我正在寻找更具体的内容。
我得到了 Content
objects 的列表和 Data
objects:
的列表
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
我想通过标题 属性 将每个 Content
与其对应的 Data
相匹配,并通过传递一个 class Movie
将所有内容组合在一起另一个 objects 到 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?)
- 使用我目前正在使用的 multi-setters 方法(根据我的理解,这不是最 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
用作辅助构造函数 - 您将在其中使用函数中第二个参数的值来填充 Movie
class 中的属性s 构造函数。
我已经使用 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,
)
我已经阅读了 how to overload... and multiple constructors in python 以及有关此主题的更多内容,但是我正在寻找更具体的内容。
我得到了 Content
objects 的列表和 Data
objects:
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
我想通过标题 属性 将每个 Content
与其对应的 Data
相匹配,并通过传递一个 class Movie
将所有内容组合在一起另一个 objects 到 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?)
- 使用我目前正在使用的 multi-setters 方法(根据我的理解,这不是最 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
用作辅助构造函数 - 您将在其中使用函数中第二个参数的值来填充 Movie
class 中的属性s 构造函数。
我已经使用 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,
)