python - 如何将 "broadcast"消息发送给一个类的所有对象?

标签 python

class Person:
    def __init__(self, name):
        self.name = name
        self.bucket = []
    def announce(self, *args):
        # ???
        pass
    def put(self, item):
        self.bucket.append(item)


p1 = Person("ya")
p2 = Person("yu")

p1.put("apple")

现在我想以某种方式向所有 Person() 对象宣布我的桶中有一个苹果,如果他们愿意,他们也应该将一个苹果放入桶中。

最佳答案

简单的实现可以是:

class Person:
    persons = set()

    def __init__(self, name):
        self.name = name
        self.bucket = []
        self.persons.add(self)

    def announce(self, msg):
        print("[{}]: {}".format(self.name,msg))

    @classmethod
    def broadcast(cls, person, msg):
        for p in cls.persons:
            if not p is person:
                p.announce(msg)

    def put(self, item):
        self.bucket.append(item)
        self.broadcast(self, '{}: got {} in my bucket!'.format(self.name, item))

p1 = Person("ya")
p2 = Person("yu")

p1.put("apple")
Person.broadcast(None, "Hey! Everybody can broadcast message!")

输出:

[yu]: "ya: got apple in my bucket!
[ya]: Hey! Everybody can broadcast message!
[yu]: Hey! Everybody can broadcast message!

该实现缺乏

  • 没有注销实现
  • 无线程保存
  • 可以通知Person及其子类
  • 这只是一个玩具,您需要根据实际情况对其进行调整

也许你最好实现一个 Observer pattern比那个简单的要好。

关于python - 如何将 "broadcast"消息发送给一个类的所有对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27602136/

相关文章:

python - 使用 Django 迁移添加 Postgres 全文搜索字段

python - 嵌套字典中的求和值

python - 根据属性选择列表中的随机元素

python - 如何在不使用内置 map 或星图的情况下编写类似星图的函数?

python - 为什么在 Python (\n) 中更改字符串中的行不起作用?

python - Django: NotImplementedError: annotate() + distinct(fields) 未实现

python - 确定列表中的所有元素是否都存在并且在另一个列表中的顺序相同

python - 将具有重复键的元组列表转换为列表字典

python - 如何创建字典元组

python - 使用 python 在 Mysql 中进行一些插入