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

时间:2014-11-03 17:57:50

标签: python oop

我正在使用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

现在,我可以在@staticmethod之前使用transmit来实现此功能。然后我添加了方法(来自twisted)self.sendMessage。我收到一个错误:“未定义全局名称自我”。好。所以我将对象作为第一个参数传递出来:

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

然后我得到一个这样的错误:'unbound方法sendMessage()必须用'class A'实例作为第一个参数调用(改为获得classobj实例)

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

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

编辑:更新以显示'自我'引用(如评论中所建议),我上面的代码得到的错误是:必须使用{{调用unbound方法sendMessage() 1}} instance作为第一个参数(改为使用classobj实例)

1 个答案:

答案 0 :(得分:1)

我对下面的代码做了一些更改,基本上你需要记住:

  1. 在创建对象方法时使用self关键字。
  2. 您需要将data值作为方法参数传递,或以某种方式分配(见下文)。
  3. 以下是如何传递数据类到类的示例:

    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)