Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中将数据传递给另一个类_Python_Oop - Fatal编程技术网

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

在Python中将数据传递给另一个类,python,oop,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.transm

我使用的是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
来实现这一点。然后我添加了方法(来自twisted)
self.sendMessage
。我收到一个错误:“未定义全局名称self”。好啊因此,我将对象作为第一个参数传递,如下所示:

self.point_to_A.transmit(self.point_to_A, data)
然后我得到一个类似这样的错误:“必须使用'class A'实例作为第一个参数调用unbound method sendMessage()(改为使用classobj实例)

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

如何从子对象“B”调用子对象“a”中的函数,并将数据传递给该函数,从而使“a”中的函数中的“self”可用(根据所使用的扭曲方法的要求)


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

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

  • 创建对象方法时使用
    self
    关键字
  • 您需要将
    数据
    值作为方法参数传递,或者以某种方式分配它(见下文)
  • 下面是一个如何向类传递数据的示例:

    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:您需要以某种方式声明
    数据。如我所示,将其作为方法参数传递,或者需要将其声明为属性:

    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)
    

    注意2:您需要调用方法为:
    method(class\u实例,args)
    class\u实例。method(args)

    编辑

    作为我们在评论中讨论的补充。明确声明
    点到点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)
    

    self
    添加到类参数中。我认为这与指示代码中某个地方正在调用
    A.call(…)
    之类的内容的错误无关,它抱怨没有名为
    call
    的方法。如果你想给我更多的信息,我可以试着帮助你。当你调用一个类实例方法作为
    self.point\u to\u a.transmit(self.data)
    时,它将
    self.point\u to\u a
    作为第一个参数,将
    self.data
    作为第二个参数,这符合方法声明
    def transmit(self,data)
    。您能否提供有关收到的错误的更多信息?添加一些print语句以查看代码失败的确切位置,或者使用@horsehear命令,这也很有用。上下文如何?是哪条线出的错?@马毛:当然!
     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)