2005年11月09日 星期三 13:08
下面我写了一个使用NewEdit中的Mixin模块所做的演示,有兴趣可以下载NewEdit试一试。 1. 工作准备 因为只演示Mixin模块,因此我们先创建一个目录,比如:test,然后将NewEdit的modules下的Mixin.py和Debug.py两个文件拷贝到test下。为什么要Debug呢?因为Mixin.py中使用了这个模块,Debug是用来进行错误输出的,如果你不需要,那么你要修改Mixin的代码,如果只是想禁止信息生成(会在当前目录下自动生成debug.txt和error.txt两个文件),你可以修改Debug.txt,将开始的Debug = True改为Debug = False。 这样目录test下已经有两个文件了Mixin.py和Debug.py。 2. 生成主程序 创建main.py。文件内容为: import Mixin class A(Mixin.Mixin): __mixinname__ = 'a' def __init__(self): self.initmixin() self.callplugin('init', self) import mPrint if __name__ == '__main__': a = A() a.Print() 很简单。第一行导入Mixin模块。然后是定义了slot class,它需要从Mixin类派生,需要定义一个类属性__mixinname__,这里设为'a'。然后在__init__中首先要调用self.initmixin()方法,它其实是Mixin类的方法。接着设定了一个插入点(或叫调用点)self.callplugin('ini', self),插入点名称为'init',有一个参数是self,表示将实例传给这个插入点。 接下来导入mPoint模块,它将存放我们的mixin部件的代码。 再往后是我们的一个测试,创建A的一个实例,然后调用a.Print()方法。注意,在原始的A中我们并没有定义Print这个方法,这个方法将在mPrint中定义。 上面的程序因为还没有完成mPrint.py模块,因此不能运行。但如果去掉import mPrint和a.Print(),仍然是可以运行的,不过什么结果也看不到。 3. 编写mPrint.py 也许有人会问,为什么不在main.py中进行扩展,原因就是尽量不对原来的程序进行修改,新的东西尽可能用新的文件。这也就是我曾经写过"分部类编程"的想法。一个类是由多个文件构成的,新的功能只要在新的文件中定义就可以了。这种想法是希望对原始程序尽可能少改,甚至不改。 mPrint.py内容如下: import Mixin def init(self): self.name = 'mPrint.py' Mixin.setPlugin('a', 'init', init) def Print(self): print self.name Mixin.setMixin('a', 'Print', Print) 首先也是导入Mixin,然后定义了一个Plugin -- init,它将与A类中的插入点'init'相关联,它实现了在self(A的一个实例)上增加一个新的name属性。然后定义了一个Mixin,它实现了在A上增加了一个Print方法,而这个方法又使用Plugin中增加的name属性。 4. 测试 运行一个main.py结果就是打印出 'mPrint.py' 来。 向类增加属性,可能不使用Plugin,然后在Plugin中增加赋值语句的方法,比如,把mPrint.py改为: import Mixin name = 'mPrint.py' Mixin.setMixin('a', 'name', name) def Print(self): print self.name Mixin.setMixin('a', 'Print', Print) 这样,就是采用Mixin的方式向类中增加属性。你还可以试试,比如将A中提前定义好一个属性,可以是int, string, list, tuple, dict,然后在mPrint中修改它,比如: main.py为: ----------------------------------------------------------------------------------------- import Mixin class A(Mixin.Mixin): __mixinname__ = 'a' m = {'a':'a'} def __init__(self): self.initmixin() self.callplugin('init', self) import mPrint if __name__ == '__main__': a = A() print a.m ----------------------------------------------------------------------------------------- mPrint.py为: ----------------------------------------------------------------------------------------- import Mixin d = {'b':3} Mixin.setMixin('a', 'm', d) ----------------------------------------------------------------------------------------- 看一下结果。 总之有许多种方法你可以进行测试。 -- I like python! My Blog: http://www.donews.net/limodou NewEdit Maillist: http://groups.google.com/group/NewEdit
2005年11月15日 星期二 09:13
我照着例子做了一下,不过很遗憾,debug信息告诉我在Debug.py 文件的line 31行的import common找不到,我又把common.py拷贝下来,然后又要求需要GenericDispatch模块,然后, 我就没有再往下做了,你们有人做过这个例子吗?不妨指点一二,谢谢。
2005年11月15日 星期二 10:03
在 05-11-15,FireBird<ygonic at gmail.com> 写道: > 我照着例子做了一下,不过很遗憾,debug信息告诉我在Debug.py 文件的line 31行的import > common找不到,我又把common.py拷贝下来,然后又要求需要GenericDispatch模块,然后, > 我就没有再往下做了,你们有人做过这个例子吗?不妨指点一二,谢谢。 > 又看了一下,原来我的Debug.py版本已经发生了变化。最简单的修改方法就是将Debug.py中的DEBUG改为False,然后删除common。不过我会修改NewEdit的Debug.py 使其关联性更小一些。 不好意思。 -- I like python! My Blog: http://www.donews.net/limodou NewEdit Maillist: http://groups.google.com/group/NewEdit
2005年11月15日 星期二 10:21
在 05-11-15,limodou<limodou at gmail.com> 写道: > 在 05-11-15,FireBird<ygonic at gmail.com> 写道: > > 我照着例子做了一下,不过很遗憾,debug信息告诉我在Debug.py 文件的line 31行的import > > common找不到,我又把common.py拷贝下来,然后又要求需要GenericDispatch模块,然后, > > 我就没有再往下做了,你们有人做过这个例子吗?不妨指点一二,谢谢。 > > > > 又看了一下,原来我的Debug.py版本已经发生了变化。最简单的修改方法就是将Debug.py中的DEBUG改为False,然后删除common。不过我会修改NewEdit的Debug.py > 使其关联性更小一些。 > > 不好意思。 > 我已经将Debug.py代码在svn中改为老的了,可以试了。需要下载最新的svn中的源代码。 -- I like python! My Blog: http://www.donews.net/limodou NewEdit Maillist: http://groups.google.com/group/NewEdit
Zeuux © 2025
京ICP备05028076号