繁体   English   中英

将数据传递给Python中的另一个类

[英]Passing data to another class in Python

我正在使用Twisted,并且有几个不同类型的回调(因此它们不共享工厂)。 我试图将数据从一个回调对象传递到另一个:

class CallbackA(object):
  def transmit(self, data):
    self.sendMessage(self, data)

class CallbackB(object):
  def doRead(self): # this is called by Twisted
    self.point_to_A.transmit(self.point_to_A, data)

class bigClass(object):
  A = aClass
  B = bClass
  self.B.point_to_A = self.A

现在,我可以通过在transmit之前使用@staticmethod使其工作。 然后我添加了方法(来自扭曲) self.sendMessage 我收到一个错误:“未定义全局名称self”。 好。 因此,我将对象作为第一个参数传递,如下所示:

self.point_to_A.transmit(self.point_to_A, data)

然后我得到这样的错误:'必须以'class A'实例作为第一个参数来调用'unbound方法sendMessage()(取而代之的是class classobj实例)

因此,似乎我不明白如何将数据传递给子对象(在同一父对象下实例化的对象)之间的函数。 在这种情况下扭曲的回调。

如何从子对象“ B”中调用子对象“ A”中的函数,并将数据传递给该函数,以使该函数中的“ self”在“ A”中可用(如所使用的Twisted方法所要求) ?

编辑:更新以显示“自我”引用(如注释中所建议),我在上面的代码中遇到的错误是:必须以aClass实例作为第一个参数来调用未绑定方法sendMessage()(改为使用classobj实例)

我对以下代码进行了一些更改,基本上您需要记住:

  1. 在创建对象方法时使用self关键字。
  2. 您需要将data值作为方法参数传递,或以某种方式赋值(请参见下文)。

这是一个如何在类之间传递数据的示例:

class CallbackA(object):
    def transmit(self,data):  # See note 1
        do_stuff_with(data)   # See note 1

class CallbackB(object):
    def doRead(self,data):              # see note 1
        self.point_to_A.transmit(data)  # see note 2

class bigClass(object):
    def __init__(self):
        self.A = CallbackA()
        self.B = CallbackB()
        self.B.point_to_A = self.A

上面的代码可能无法按原样工作,而是一个示例,说明了如何以描述的方式将数据传递给另一个类。 您应该可以从该示例开始工作。

然后当它被调用时:

test = bigClass()
test.B.doRead(data)

注意1:您需要以某种方式声明data 如我所示,将其作为方法参数传递,或者需要将其声明为属性:

class CallbackA(object):
    def transmit(self,data):
        do_stuff_with(self.data)

class CallbackB(object):
    def __init__(self,data):
        self.data = data

    def doRead(self):
        self.point_to_A.transmit(self.data)

要么

class CallbackA(object):
    def transmit(self,data):
        do_stuff_with(self.data)

class ClassB(object):
    def set_data(self,data):
        self.data = data

    def doRead(self):
        self.point_to_A.transmit(self.data)

注2:您需要将方法调用为: method(class_instance, args)class_instance.method(args)

编辑

作为我们在评论中讨论的附加内容。 明确声明point_to_A

 class ClassB(object):
    def __init__(self,A):
        self.point_to_A = A

    def set_data(self,data):
        self.data = data

    def doRead(self):
        self.point_to_A.transmit(self.data)

暂无
暂无

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

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