python - 类中的 Python 对象实例化(奇怪的行为)
问题描述
我不明白为什么会这样:
当我使用该add_promo()
函数将promo
对象直接添加到self.spl
(使用其self.spl.add(promo)
函数)时,每个 Day 对象都会获得一个不同的StoryPromoList
对象。
但是如果我添加promo
through 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)
解决方案
推荐阅读
- php - 在php中设置标签样式
- google-api - 使用新 Gmail 主题时,Google Tasks API 不会提供有关任务完成的更新
- redis - 如何在本地配置 Redis 缓存?
- html - PWA 与 html5 网络应用?
- c# - 如果代码有其他方法可以编写吗?
- java - Java Swing JTextArea 行号
- php - 如何在 Laravel 5.6 中为每个通知文件创建具有单独通知表的多个通知文件
- android - 如何在不在线的情况下发送通知?
- c# - 从程序集中获取所有资源的列表
- ios - 将 ASWebAuthenticationSession 与 OAuth 或任何 Web 服务一起使用?