在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
让这个工作起来了。然后我添加了一个方法(来自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 个回答
我对下面的代码做了一些修改,基本上你需要记住以下几点:
- 在创建对象的方法时,要使用
self
这个关键词。 - 你需要把
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)