首页 > 解决方案 > 类中的 Python 对象实例化(奇怪的行为)

问题描述

我不明白为什么会这样:

当我使用该add_promo()函数将promo对象直接添加到self.spl(使用其self.spl.add(promo)函数)时,每个 Day 对象都会获得一个不同的StoryPromoList对象。

但是如果我添加promothrough self.cpl.add_promo(promo)which 基本上只是做同样的事情但有一个额外的步骤,每个 Day 对象都会被分配相同的StoryPromoList对象,而不是不同的对象。

对象已创建,但由于StoryPromoList某种原因,只有最后一个用于所有日子。

这是Day课程:

class Day():
    def __init__(self, date:date):
        self.date = date
        self.spl = StoryPromoList()
        self.fpl = FeedPromoList()
        self.cpl = CombinedPromoList(self.spl, self.fpl)
        self.weekday = self.date.weekday()      

    def __repr__(self):
        return f"<Day object (date='{self.date}')>"

    def add_promo(self, promo):
        self.cpl.add_promo(promo)
        # assign promo to the corresponding timeblock

    def get_all_promos(self):
        print(self.spl._id, self.date, self.cpl)
        return {'story_promos': [p for p in self.cpl.spl.list], 'feed_promos': [p for p in self.cpl.fpl.list]}

当我get_all_promos()每天执行该函数时,我会得到以下输出:

6 2021-09-27 <__main__.CombinedPromoList object at 0x00000244AADABBE0>
6 2021-09-28 <__main__.CombinedPromoList object at 0x00000244AADAB9A0>
6 2021-09-29 <__main__.CombinedPromoList object at 0x00000244AADAB730>
6 2021-09-30 <__main__.CombinedPromoList object at 0x00000244AADAB4C0>
6 2021-10-01 <__main__.CombinedPromoList object at 0x00000244AADAB250>

这是CombinedPromoList课程:

class CombinedPromoList():
    def __init__(self, spl=StoryPromoList(), fpl=FeedPromoList()) -> None:
        self.spl = spl
        self.fpl = fpl

    def add_promo(self, promo):
        if promo.type_name() == 'story':
            self.spl.add(promo)
        elif promo.type_name() == 'feed':
            self.fpl.add(promo)

这是与细微差别相同StoryPromoList的:FeedPromoList

class StoryPromoList():
    classes = []
    _id = 0
    def __init__(self, list=[]):
        self.id=StoryPromoList._id
        StoryPromoList._id += 1
        StoryPromoList.classes.append(self)
        self.list = list

    def add(self, storypromo:StoryPromo):
        self.list.append(storypromo)

标签: python

解决方案


推荐阅读