首页 > 解决方案 > 使用不同的对象类型作为参数初始化 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 参数来组合一个类下的所有内容:DataMovieMovie

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

任何想法或建议将不胜感激。

标签: pythonconstructorinitializationclass-method

解决方案


您可以使用classmethods 作为辅助构造函数 - 您将使用函数中第二个参数的值来填写Movie类构造函数中的属性。

我使用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,
    )

推荐阅读