gpt4 book ai didi

python - 在不实例化类的情况下跨类传递数据

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:43 25 4
gpt4 key购买 nike

我有两个类需要在彼此之间传递数据。第一个类实例化第二个。第二类需要能够将信息传递回第一类。但是我无法从第二类再次实例化 ClassOne 。这两个类都在共享计时器上运行,它们在其中轮询不同的事物,因此当它们共享计时器时,它们不能共享它们轮询的对象。

我目前的解决方案(有效)是将一个方法传递给 ClassTwo 并用于发送数据备份,但我觉得这可能有点 hack-ey 并且是错误的方法.

classOne():

def __init__(self,timer):
self.classTwo = classTwo(self.process_alerts,timer)
self.classTwo.start

def process_alerts(alert_msg):
print alert_msg


classTwo():

def __init__(proses_alerts,timer)
self.process_alerts = process_alerts # <----- class ones method

def start(self):
check for alerts:
if alert found:
self.alert(alert_msg)


def alert(self,alert_msg):
self.process_alert(alert_msg) # <----- ClassOnes method

感谢您的宝贵时间。

最佳答案

没有什么能阻止您通过当前的 ClassOne实例 ( self ) 到它自己的 ClassTwo实例:

class ClassOne(object):
def __init__(self):
self.two = ClassTwo(self)
self.two.start()

def process_alert(self, msg):
print msg

class ClassTwo(object):
def __init__(self, parent):
self.parent = parent

def start(self):
while True:
if self.has_message():
self.parent.process_alert(self.get_message())

请注意,在此上下文中,“parent”表示它是一种包含关系(“has a”),与继承无关(“is a”)。

如果你有什么问题,那就是ClassOne负责实例化ClassTwo (这确实引入了强耦合),您可以更改 ClassOne所以它需要一个工厂:

class ClassOne(object):
def __init__(self, factory):
self.other = factory(self)
self.other.start()

#等

然后通过ClassTwo作为工厂:

c1 = ClassOne(ClassTwo)  

所以你实际上可以通过正确的接口(interface)传递任何返回对象的东西(使单元测试更容易)

或者 - 至少在你的(我假设精简版)示例中 - 你可以制作 ClassOne将自身传递给 ClassTwo.start()并明确传递 ClassTwo实例到 ClassOne ,即:

class ClassOne(object):
def __init__(self, other):
self.other.start(self)

def process_alert(self, msg):
print msg


class ClassTwo(object):
def start(self, parent):
while True:
if self.has_message():
parent.process_alert(self.get_message())


c2 = ClassTwo()
c1 = ClassOne(c2)

或者更简单地删除对 ClassTwo.start 的调用来自 ClassOne而且您不需要对 ClassTwo 的任何引用ClassOne.__init__ 中的实例:

class ClassOne(object):

def process_alert(self, msg):
print msg


class ClassTwo(object):
def start(self, parent):
while True:
if self.has_message():
parent.process_alert(self.get_message())


c1 = ClassOne()
c2 = ClassTwo()
c2.start(c1)

它尽可能地解耦,但只有在 ClassTwo 时才有效只需要 ClassOne start() 中的实例和从 start 调用的方法和 ClassOne不需要保留对 ClassTwo 的引用实例要么。

关于python - 在不实例化类的情况下跨类传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44758547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com