使用不同的 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())

根据我目前阅读的内容,我的选择是:

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?)
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 构造函数。

我已经使用 dataclasses 制作了示例,因为这样可以使代码更短,但功能相同。 (或更多)

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,
    )