繁体   English   中英

在 Python 中的 class 中的字典中更新值

[英]Upading value in dictionary within class in Python

如何更新 class 中字典中的值?

function 'read_messages' 应该打印在__init__中创建的用户收件箱中的前 N 条消息,并将它们的 'read' 值更改为True以便下次调用 function 时不会打印它们。

这是我的代码:

class Outlook:
    def __init__(self, users):
        self.message_id = 0
        self.inboxes = {usr: [] for usr in users}

    def send_email(self, sender, recipient, title, body):
        user_inbox = self.inboxes[recipient]
        self.message_id = self.message_id + 1
        message_details = {
            'id': self.message_id,
            'title': title,
            'body': body,
            'sender': sender,
            'read': False
        }
        user_inbox.append(message_details)
        return self.message_id

    def read_messages(self, user, N):
        user_inbox = self.inboxes[user]
        for message in user_inbox[:N]:
            if message['read'] == False:
                print(message)
                message['read'] = True # this does not seem to work


ol1 = Outlook(['James Bond'])

ol1.send_email(
    sender='M',
    recipient='James Bond',
    title='Return to England!',
    body='James, return to England immediately',
)
ol1.send_email(
    sender='Miss Moneypenny',
    recipient='James Bond',
    title='Meeting with M',
    body='James, M wants to see you tomorrow at 11:00',
)

ol1.read_messages('James Bond',2)

编辑:在第一次调用 'ol1.read_messages' 之后,我希望再次调用它时不会打印任何项目。

这段代码适用于我的朋友。 我认为您的问题是持久性问题之一。 如果您连续调用ol1.read_messages('James Bond',2) (即编写指令两次),您会看到消息只打印一次。 第二次调用不打印任何项目。 但是,连续运行 python 程序每次都会显示这些消息,因为每次运行程序时,都会再次创建消息。

我稍微修改了您的代码,以便您可以看到它的效果。 在这里,无论它们是否已被阅读,我都让它打印消息。 您可以看到第二次打印消息时, read属性已设置为false 这意味着您正在正确更新字典。

但是,每次运行代码时都会打印 2 条消息,因为每次运行程序时,都是从头开始。 程序结束时,将保存ol1的memory返回给系统,再次启动程序时,会重新创建ol1并给它新的消息。

class Outlook:
    def __init__(self, users):
        self.message_id = 0
        self.inboxes = {usr: [] for usr in users}

    def send_email(self, sender, recipient, title, body):
        user_inbox = self.inboxes[recipient]
        self.message_id = self.message_id + 1
        message_details = {
            'id': self.message_id,
            'title': title,
            'body': body,
            'sender': sender,
            'read': False
        }
        user_inbox.append(message_details)
        return self.message_id

    def read_messages(self, user, N):
        user_inbox = self.inboxes[user]
        for message in user_inbox[:N]:
            if message['read'] == False:
                print(message)
                message['read'] = True 
            else: # This will print read messages
                print(message)


ol1 = Outlook(['James Bond'])

ol1.send_email(
    sender='M',
    recipient='James Bond',
    title='Return to England!',
    body='James, return to England immediately',
)

ol1.send_email(
    sender='Miss Moneypenny',
    recipient='James Bond',
    title='Meeting with M',
    body='James, M wants to see you tomorrow at 11:00',
)

ol1.read_messages('James Bond', 2)

print('\nThis time the "read" attribute is true')
ol1.read_messages('James Bond', 2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM