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

1 投票
1 回答
5962 浏览
提问于 2025-05-01 08:52

我正在使用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让这个工作起来了。然后我添加了一个方法(来自Twisted)self.sendMessage。结果我遇到了一个错误:'global name self is not defined'(全局名称self未定义)。好的。所以我像这样把对象作为第一个参数传递:

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

然后我又遇到了一个错误:'unbound method sendMessage() must be called with 'class A' instance as first argument (got classobj instance instead)'(未绑定的方法sendMessage()必须用'class A'的实例作为第一个参数调用(而不是classobj实例))。

所以看起来我不太明白如何在子对象之间传递数据(在同一个父对象下实例化的对象);在这种情况下是Twisted的回调。

我该如何从子对象'A'调用函数,并从子对象'B'传递数据给这个函数,以便在'A'中的那个函数里可以使用'self'(这是Twisted方法所需要的)?

编辑:更新了以显示'self'引用(根据评论的建议),我在上面的代码中遇到的错误是:未绑定的方法sendMessage()必须用aClass的实例作为第一个参数调用(而不是classobj实例)。

暂无标签

1 个回答

2

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

  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)

撰写回答