Python论坛  - 讨论区

标题:[python-chinese] NewEdit中Mixin模块的一个演示

2005年11月09日 星期三 13:08

limodou limodou at gmail.com
Wed Nov 9 13:08:24 HKT 2005

下面我写了一个使用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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月15日 星期二 09:13

FireBird ygonic at gmail.com
Tue Nov 15 09:13:48 HKT 2005

我照着例子做了一下,不过很遗憾,debug信息告诉我在Debug.py 文件的line 31行的import
common找不到,我又把common.py拷贝下来,然后又要求需要GenericDispatch模块,然后,
我就没有再往下做了,你们有人做过这个例子吗?不妨指点一二,谢谢。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月15日 星期二 10:03

limodou limodou at gmail.com
Tue Nov 15 10:03:43 HKT 2005

在 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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月15日 星期二 10:21

limodou limodou at gmail.com
Tue Nov 15 10:21:19 HKT 2005

在 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

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号