如何在 Python 中的兄弟 objects 之间进行通信,当使用组合而不是继承时
How to communicate between sibling objects in Python, when using Composition, not Inheritance
我有一个 parent object,它由 2 个(不同的)child object 组成。
2 child 个实例需要通信。例如,假设 child1 需要发送一些东西给 child2:
import children
class Parent:
def __init__(self):
self.child1 = children.Child1(self.q)
self.child2 = children.Child2(self.q)
parent = Parent()
parent.child1.send("string")
是否有推荐的模式来实现这一目标?
我能想到的最好办法是在 2 个 object 之间创建一个队列。这可行,但它需要接收 object 到 运行 一个线程。例如:
parent.py:
import children
import queue
import time
class Parent:
def __init__(self):
self.q = queue.Queue()
self.child1 = children.Child1(self.q)
self.child2 = children.Child2(self.q)
parent = Parent()
parent.child1.send("string")
time.sleep(1)
children.py:
import threading
class Child1:
def __init__(self, q):
self.q = q
def send(self, item):
self.q.put(item)
class Child2:
def __init__(self, q):
self.q = q
self.receiver = threading.Thread(target=self.worker, daemon=True).start()
def worker(self):
"""Process the queue"""
while True:
item = self.q.get()
print(f"{item} received")
实际上,我在队列中发送的“项目”是一个函数名和一个参数列表。这基本上就是 here 中描述的命令模式。但我不喜欢接收线程的需要。
我希望可以允许一个 object 直接调用另一个 object 中的方法。
如果它们之间存在 继承 关系,具有共同的 parent,我可能会为此使用 super()
:
class Child1:
def send(self, function, arguments):
super().child2.function(arguments)
但在我的例子中没有继承:只有组合。
有没有更好的方法?
只需构造带有对父对象的引用的子对象:
class Child1:
def __init__(self, parent):
self.parent = parent
def send(self, msg):
self.parent.child2.print_out(msg)
class Child2:
def __init__(self, parent):
self.parent = parent
def print_out(self, msg):
print(msg)
class Parent:
def __init__(self):
self.child1 = Child1(self)
self.child2 = Child2(self)
parent = Parent()
parent.child1.send("foo")
我有一个 parent object,它由 2 个(不同的)child object 组成。 2 child 个实例需要通信。例如,假设 child1 需要发送一些东西给 child2:
import children
class Parent:
def __init__(self):
self.child1 = children.Child1(self.q)
self.child2 = children.Child2(self.q)
parent = Parent()
parent.child1.send("string")
是否有推荐的模式来实现这一目标?
我能想到的最好办法是在 2 个 object 之间创建一个队列。这可行,但它需要接收 object 到 运行 一个线程。例如:
parent.py:
import children
import queue
import time
class Parent:
def __init__(self):
self.q = queue.Queue()
self.child1 = children.Child1(self.q)
self.child2 = children.Child2(self.q)
parent = Parent()
parent.child1.send("string")
time.sleep(1)
children.py:
import threading
class Child1:
def __init__(self, q):
self.q = q
def send(self, item):
self.q.put(item)
class Child2:
def __init__(self, q):
self.q = q
self.receiver = threading.Thread(target=self.worker, daemon=True).start()
def worker(self):
"""Process the queue"""
while True:
item = self.q.get()
print(f"{item} received")
实际上,我在队列中发送的“项目”是一个函数名和一个参数列表。这基本上就是 here 中描述的命令模式。但我不喜欢接收线程的需要。
我希望可以允许一个 object 直接调用另一个 object 中的方法。
如果它们之间存在 继承 关系,具有共同的 parent,我可能会为此使用 super()
:
class Child1:
def send(self, function, arguments):
super().child2.function(arguments)
但在我的例子中没有继承:只有组合。 有没有更好的方法?
只需构造带有对父对象的引用的子对象:
class Child1:
def __init__(self, parent):
self.parent = parent
def send(self, msg):
self.parent.child2.print_out(msg)
class Child2:
def __init__(self, parent):
self.parent = parent
def print_out(self, msg):
print(msg)
class Parent:
def __init__(self):
self.child1 = Child1(self)
self.child2 = Child2(self)
parent = Parent()
parent.child1.send("foo")