python中对象之间怎么传递信息?

lidongwu 2010-11-12 10:44:59
有感于python的强大,开始学习python。
学习的同时在关注自己的难点是不是在python中能够得到解决,到目前,有一点不明确,说出来高手们指点一二,如果这个问题解决了,python将会正式成为我的编程语言。
最初都是用C++来做的,两个对象,知道了对方的指针,就可以直接调用对方的方法传递消息。因为需要互相包含头文件,耦合度很高,两个类做不到独立,不好。
后来利用了QT的信号/槽机制,两个对象间传递信息更加便利安全。管理程序分别把两个对象建立起来之后,把他们的信号和槽连接起来就行了,两个类可以在代码上完全独立,改善了很多。
现在我的问题是,在python中,有没有像qt的这种信号/槽的机制呢?或者用其他的方式,做到两个类在代码上可以独立的?
...全文
637 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lidongwu 2010-11-16
  • 打赏
  • 举报
回复
看到7楼的例子,确实是我想要的,结贴给分。

谢谢!
lidongwu 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 iambic 的回复:]
如果一门语言提供的基本机制不用,非要自己创造一个,说明这门语言也够失败的了。
[/Quote]
可能我对问题的描述不够明确吧。
我的问题就是在于,怎么让一个对象(动态的,编程时并不知道这个对象是什么,这样的对象有多少个)在运行时,把信号向另外的对象(也是动态创建的,编程时并不知道这个对象是什么,这样的对象有多少个)发送。也就是说,可能多个对象向多个对象发信息,至于一个对象会向哪些对象发信息,或者哪些对象会对一个对象发信息,完全取决于运行状态。
这几天怀着这个问题看python的教程,还没找到好办法,但这个问题在QT中已经完美地解决了。
我就是不想自己创造一个机制,想利用语言所提供的机制,才到这里问的,呵呵。
lidongwu 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 i_nbfa 的回复:]
有pyqt,不过举个具体例子,你的问题好像没到非QT不可的地步。
[/Quote]
不是非用qt不可,而是因为别的原因使用qt,而正好利用了qt的信号/槽机制,又感到qt比较方便。
magic_feng 2010-11-15
  • 打赏
  • 举报
回复
看看python源码剖析吧
I_NBFA 2010-11-15
  • 打赏
  • 举报
回复
python应该没有这种机制C++也毛有都是qt自己发明的,其实就是类似观察者模式的东东。
直接用pyqt最方便不过你要是只看中信号槽其它就累赘了,我用python简单的模拟下看你需求吧

class SignalSlot(object):

def __init__(self):
self._SSPool = {};

def connect(self, signal, slot):
if(signal not in self._SSPool):
self._SSPool[signal] = [];
if(slot not in self._SSPool[signal]):
self._SSPool[signal] += [slot];

def emit(self, signal, args):
if(signal in self._SSPool):
slots = self._SSPool[signal];
for i in range(len(slots)):
slots[i](*args);

class Interface(SignalSlot):

#signals
def ValueChanged(self):
self.emit("ValueChanged", ());
def InputDone(self, text):
self.emit("InputDone", (text,));
def Scroll(self, x, y):
self.emit("Scroll", (x, y));

class User(object):

#slots
def ValueChanged(self):
print(self);
print("ValueChanged-User");
def InputDone(self, text):
print(self);
print("InputDone-User the text is:", text);
def Scroll(self, x, y):
print(self);
print("Scroll-User go to (%d:%d)" % (x, y));



inf = Interface();
user1 = User();
user2 = User();

inf.connect("ValueChanged", user1.ValueChanged);
inf.connect("ValueChanged", user1.ValueChanged);
inf.connect("ValueChanged", user2.ValueChanged);
inf.connect("InputDone", user1.InputDone);
inf.connect("Scroll", user2.Scroll);

inf.ValueChanged();
inf.InputDone("my name is Tim");
inf.Scroll(100, 200);

codesnail 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lidongwu 的回复:]
引用 3 楼 iambic 的回复:
如果一门语言提供的基本机制不用,非要自己创造一个,说明这门语言也够失败的了。

可能我对问题的描述不够明确吧。
我的问题就是在于,怎么让一个对象(动态的,编程时并不知道这个对象是什么,这样的对象有多少个)在运行时,把信号向另外的对象(也是动态创建的,编程时并不知道这个对象是什么,这样的对象有多少个)发送。也就是说,可能多个对象向多个对象发信息,至于一个……
[/Quote]
楼主,,,,,qt不是完美的解决了你的问题,他只是在gui这个方面把消息传递给你封装了罢了,这和语言是两个层面的问题,语言层面的对象传递消息当然是通过成员函数了。。。。。。。
iambic 2010-11-12
  • 打赏
  • 举报
回复
Python使用对象的时候不需要静态知道对象的类型(就是不需要import),没有C++里的问题。直接用就行了。
iambic 2010-11-12
  • 打赏
  • 举报
回复
如果一门语言提供的基本机制不用,非要自己创造一个,说明这门语言也够失败的了。
I_NBFA 2010-11-12
  • 打赏
  • 举报
回复
有pyqt,不过举个具体例子,你的问题好像没到非QT不可的地步。

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧