Python论坛  - 讨论区

标题:Re: [python-chinese] 讨论一下Mixin吧!

2005年11月09日 星期三 10:23

Du Jun jdu at haiercct.com.cn
Wed Nov 9 10:23:24 HKT 2005

还是不太清楚这个东西,先贴一下:
来自NewEdit的说明文档:
"""
NewEdit项目于2004年4月22正式开始编码,在此前经过仔细的框架考虑。现在它使用两种基本结构:Mixin和Plugin。关于两者区别在我的blog 中仔细进行了区分。简单地说,这两者都是对类进行扩充的机制,Mixin是用来增加新的成员变量和成员方法,而Plugin是对程序中设定的特别调用点进行处理的插件(有点象回调函数或伪事件)。这样,我首先实现一个基于可用的类,当实现了新的功能时,使用Mixin机制将新功能加入到类中。在类需要特殊处理的地方,预设插入点(不需要知道可能调用什么东西,只需要定义传入的参数接口即可),然后需要在插入点插入新的代码时,使用Plugin机制来实现。因为程序中可能不止一个类需要进行扩充,可能是很多的类,因此在Mixin和Plugin的机制中,还加入了接口识别功能,也就是说:允许进行Mixin和Plugin的类要从统一的Mixin类进行派生,并且定义唯一的Mixin名称,用于区分不同的Mixin类。新增的Mixin或 Plugin需要使用一个插入函数将自身插入到相应的类中,需要提供要插入的Mixin名称。这样允许Mixin的类和可以Mixin以类中的内容就可以对应起来了。(更详细的内容请参阅《技术手册》)
"""
NewEdit里面有很多很好的东西,喜欢python和wxPython的,强烈建议试用,研究。

在 05-11-8,lof<flyli3415 at gmail.com> 写道:
> 终于可以发信了,
> 想问一下,是不是mixin的时候,当改变了一个类,然后申明了一个实例,然后又改变了这个类,那么这个时候这个实例是不是不会改变呢?
> 那么这个类这个时候是不是就没什么用了?
>

这个倒是不一定。如果你改变的是类的属性或方法,类本身的对象并不发生变化,这样实例中对于类的引用(__class__)也不会发生变化。完全可以做成类是动态改变,而不是一次改变,但那样的话调试及效率可能都是问题。不过,也许有适合的场合。

--
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月09日 星期三 10:54

andy.bu at kodak.com andy.bu at kodak.com
Wed Nov 9 10:54:07 HKT 2005

如何使用pydoc生成文档!!
有经验的朋友请介绍一下!!

Best Regards,
==============================
Andy Bu

Kodak Health Group
Global R&D; Center (Shanghai)
Eastman Kodak Company

Floor 25, King Tower
28 Xin Jinqiao Road
Shanghai, P.R.China 201206
Tel   :8621-58345678-3100
Mail : Andy.bu at Kodak.com
==============================
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20051109/fd13a6e6/attachment.htm

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

2005年11月09日 星期三 11:10

limodou limodou at gmail.com
Wed Nov 9 11:10:18 HKT 2005

在 05-11-9,Du Jun<jdu at haiercct.com.cn> 写道:
> 还是不太清楚这个东西,先贴一下:
> 来自NewEdit的说明文档:
> """
> NewEdit项目于2004年4月22正式开始编码,在此前经过仔细的框架考虑。现在它使用两种基本结构:Mixin和Plugin。关于两者区别在我的blog 中仔细进行了区分。简单地说,这两者都是对类进行扩充的机制,Mixin是用来增加新的成员变量和成员方法,而Plugin是对程序中设定的特别调用点进行处理的插件(有点象回调函数或伪事件)。这样,我首先实现一个基于可用的类,当实现了新的功能时,使用Mixin机制将新功能加入到类中。在类需要特殊处理的地方,预设插入点(不需要知道可能调用什么东西,只需要定义传入的参数接口即可),然后需要在插入点插入新的代码时,使用Plugin机制来实现。因为程序中可能不止一个类需要进行扩充,可能是很多的类,因此在Mixin和Plugin的机制中,还加入了接口识别功能,也就是说:允许进行Mixin和Plugin的类要从统一的Mixin类进行派生,并且定义唯一的Mixin名称,用于区分不同的Mixin类。新增的Mixin或 Plugin需要使用一个插入函数将自身插入到相应的类中,需要提供要插入的Mixin名称。这样允许Mixin的类和可以Mixin以类中的内容就可以对应起来了。(更详细的内容请参阅《技术手册》)
> """
> NewEdit里面有很多很好的东西,喜欢python和wxPython的,强烈建议试用,研究。
>

不知道你是哪里不清楚。

--
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月09日 星期三 11:18

Zoom Quiet zoom.quiet at gmail.com
Wed Nov 9 11:18:05 HKT 2005

看来想组织一个成熟可用的开源项目,涉及多方面的知识哪!
http://wiki.woodpecker.org.cn/moin/OpenSourceProjectManage
开辟  开放源代码项目管理 专页!
可以从"项目项目集锦" 导航中找到!
其中很早就组织了两大流行文档化注释工具的使用经验!
http://wiki.woodpecker.org.cn/moin/CodeCommentingRule

大家,请继续讨论,是也乎…………

在 05-11-9,andy.bu at kodak.com<andy.bu at kodak.com> 写道:
>
> 如何使用pydoc生成文档!!
> 有经验的朋友请介绍一下!!
>
>  Best Regards,
>  ==============================
>  Andy Bu
>
>  Kodak Health Group
>  Global R&D; Center (Shanghai)
>  Eastman Kodak Company
>
>  Floor 25, King Tower
>  28 Xin Jinqiao Road
>  Shanghai, P.R.China 201206
>  Tel   :8621-58345678-3100
>  Mail : Andy.bu at Kodak.com
>  ==============================
> _______________________________________________
> Python中文技术讨论邮件列表
> 发言: 发邮件到 python-chinese at lists.python.cn
> 订阅: 发送 subscribe 到 python-chinese-request at lists.python.cn
> 退订: 发送 unsubscribe 到
> python-chinese-request at lists.python.cn
> 详细说明: http://python.cn/mailman/listinfo/python-chinese
>
>


--
# Time is unimportant, only life important!
## 面朝开源,我心自由!

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

2005年11月09日 星期三 11:31

黑沙 fred.li.1979.m.bj.prc at gmail.com
Wed Nov 9 11:31:43 HKT 2005

我的理解是木头的Plugin技术是Mixin技术的一部分!Mixin定义了新的数据和方法,Plugin则设置了新方法的参数列表!匹配这个调用列表的都可以去调用这个方法?而不考虑方法名。好像是一种oo中多态的想法?提供插入函数来识别不同的调用列表。
 不知道是这个意思吗?我是初学者
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20051109/875aec3c/attachment.htm

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

2005年11月09日 星期三 11:45

黑沙 fred.li.1979.m.bj.prc at gmail.com
Wed Nov 9 11:45:59 HKT 2005

我理解的Mixin
class MixinBase:pass
class newbie1(MixinBase):pass
class newbie2(MixinBase):pass
newbie1().data_attribute = "com1"
def f(self,b,c):
newbie2().method_attribute = f
newbie2().method_attribute(1,2)
 Plugin
 ?木头给个简单的例子
 插入点识别机制
 ?木头给个简单的例子
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20051109/a8a6fd45/attachment.html

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

2005年11月09日 星期三 11:54

limodou limodou at gmail.com
Wed Nov 9 11:54:03 HKT 2005

在 05-11-9,黑沙<fred.li.1979.m.bj.prc at gmail.com> 写道:
> 我的理解是木头的Plugin技术是Mixin技术的一部分!Mixin定义了新的数据和方法,Plugin则设置了新方法的参数列表!匹配这个调用列表的都可以去调用这个方法?而不考虑方法名。好像是一种oo中多态的想法?提供插入函数来识别不同的调用列表。
>

可能还有一些名字不好解释:

mixin 是统称,我又区分为Mixin和Plugin两种。

Mixin 是增加新东西或与原有的东西合并。比如向一个类增加属性或方法。
Plugin 相当于一个回调函数的扩展,它的调用入口一定是存在于某个方法中。举例来说:

class A(Mixin):
    __mixinname__ = 'a'

    def __init__(self):
        self.initmixin()
        #code
        self.callplugin('plugin1', args1, args2)
        #code
        obj = self.execplugin('plugin2', args1, args2, args3)

上面的代码是一个slot class的例子,其中self.callplugin()和self.execplugin()是对于两种不同的Plugin的调用点。

为什么有这个东西的想法就是,我可以使用Mixin的方式将__init__方法替换掉,但可能我的处理代码为了不影响以前的东西仍然要保存许多的原始代码,这样程序看上去很乱。比如,不使用Plugin的方式,类可能为:

class A:
    def __init__(self):
        code1
        code2

这时我发现A需要修改,那么可能需要在code1和code2之间加入一些代码,不使用mixin技术,你一定是要么直接修改A的代码,要么从A派生,不管怎能么样,__init__的代码都会为:

def __init__(self):
    code1
    newcode
    code2

这样code1和code2就需要保留。如果再需要在code1和code2之间加入代码,你又要做这样的工作,要么修改A,要么从A派生,然后保留以前的代码。而采用mixin技术,你只需要在code1与code2之间加入一个插入点,那么A类就基本上不需要修改了。新的代码就使用一个新的Plugin来实现,再增加新的代码就再写一个Plugin就行了。能过Mixin模块将其合成一个Plugin的链。

因为Plugin是处于代码中间的,因此叫这个名字,这与插件的工作方式是一样的。而callplugin和execplugin的调用就是Plugin的接口定义。第一个参数是这个plugin接口的名字,后面是它的参数。而定义Plugin方法时需要按调用接口来定义参数,如上面的plugin1有两个参数,它的某个Plugin定义为:

def myplugin1(a, b):
    print a, b
Mixin.setPlugin('a', 'plugin1', myyplugin1)

这样就通过Mixin模块的setPlugin方法将myplugin1与__mixinname__为'a'的plugin调用点为'plugin1'的接口关联起来了。

在执行callplugin和execplugin时不需要传入slot class
的__mixinname__,因为自已知道在调用Plugin时使用哪个slot class的Plugins。

还有什么不清楚的吗?

--
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月09日 星期三 12:02

limodou limodou at gmail.com
Wed Nov 9 12:02:46 HKT 2005

在 05-11-9,黑沙<fred.li.1979.m.bj.prc at gmail.com> 写道:
> 我理解的Mixin
> class MixinBase:pass
> class newbie1(MixinBase):pass
> class newbie2(MixinBase):pass
> newbie1().data_attribute = "com1"
> def f(self,b,c):
> newbie2().method_attribute = f
> newbie2().method_attribute(1,2)
>
> Plugin
>
> ?木头给个简单的例子
>
> 插入点识别机制
>
> ?木头给个简单的例子

我的另一封邮件写了一个例子。简单点说:

mixin是一类技术,我分为Mixin与Plugin两类。

Mixin是对原类的属性或方法:增加、替换或合并。对于方法只能替换。
Plugin是对原类某个方法嵌入新代码。因此Plugin只有方法,没有其它类型的对象。
--
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月09日 星期三 12:23

Zoom Quiet zoom.quiet at gmail.com
Wed Nov 9 12:23:23 HKT 2005

在 05-11-9,limodou<limodou at gmail.com> 写道:
> 在 05-11-9,黑沙<fred.li.1979.m.bj.prc at gmail.com> 写道:
> > 我理解的Mixin
> > class MixinBase:pass
> > class newbie1(MixinBase):pass
> > class newbie2(MixinBase):pass
> > newbie1().data_attribute = "com1"
> > def f(self,b,c):
> > newbie2().method_attribute = f
> > newbie2().method_attribute(1,2)
> >
> > Plugin
> >
> > ?木头给个简单的例子
> >
> > 插入点识别机制
> >
> > ?木头给个简单的例子
>
> 我的另一封邮件写了一个例子。简单点说:
>
> mixin是一类技术,我分为Mixin与Plugin两类。
>
> Mixin是对原类的属性或方法:增加、替换或合并。对于方法只能替换。
> Plugin是对原类某个方法嵌入新代码。因此Plugin只有方法,没有其它类型的对象。
> --
原来如比!!这里的Plugin 不是通常软件中的插件开发,
普通的插件是指利用给出的API 开发可以与原软件合作的小部件,软件;
newEdit 中的Plugin 不过是种名称,是种浅度mixin 的扩展行为,是也乎!?

这样的话,不如使用比较容易理解的说明方式?!
newEdit 中广泛使用了 mixin 思想,所有功能通过两种行为进行开发和扩展:
1. Mix -- 对预设类的全面混入定制,增加、替换或合并属性或方法
2. Embed -- 对预设类的方法嵌入定制,增加、替换或修改原始方法

是也乎!?这样比较明了的说?!

--
# Time is unimportant, only life important!
## 面朝开源,我心自由!

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

2005年11月09日 星期三 12:33

limodou limodou at gmail.com
Wed Nov 9 12:33:49 HKT 2005

> 原来如比!!这里的Plugin 不是通常软件中的插件开发,

还是差不多。Plugin中文为插件,就是插入代码。

> 普通的插件是指利用给出的API 开发可以与原软件合作的小部件,软件;
> newEdit 中的Plugin 不过是种名称,是种浅度mixin 的扩展行为,是也乎!?
>
NewEdit中的Plugin也是小部件。本身倒没有什么深浅。

> 这样的话,不如使用比较容易理解的说明方式?!
> newEdit 中广泛使用了 mixin 思想,所有功能通过两种行为进行开发和扩展:
> 1. Mix -- 对预设类的全面混入定制,增加、替换或合并属性或方法
> 2. Embed -- 对预设类的方法嵌入定制,增加、替换或修改原始方法
>
可以改为,对预设类的方法嵌入新代码。

> 是也乎!?这样比较明了的说?!
>

大家可以这样理解,不过术语也懒得改了。:P

--
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月09日 星期三 14:18

amingsc amingsc at 163.com
Wed Nov 9 14:18:04 HKT 2005

讲得很清楚了
要是能画个示意图的话就更好啊,就不用说这么多话了
谢了

在 2005年11月9日 星期三 11:54,limodou 写道:
> 在 05-11-9,黑沙<fred.li.1979.m.bj.prc at gmail.com> 写道:
>
> > 我的理解是木头的Plugin技术是Mixin技术的一部分!Mixin定义了新的数据和方法,Plugin则设置了新方法的参数列表!匹配这个调用列表的
> >都可以去调用这个方法?而不考虑方法名。好像是一种oo中多态的想法?提供插入函数来识别不同的调用列表。
>
> 可能还有一些名字不好解释:
>
> mixin 是统称,我又区分为Mixin和Plugin两种。
..........

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

2005年11月09日 星期三 15:07

limodou limodou at gmail.com
Wed Nov 9 15:07:53 HKT 2005

在 05-11-9,amingsc<amingsc at 163.com> 写道:
> 讲得很清楚了
> 要是能画个示意图的话就更好啊,就不用说这么多话了
> 谢了
>

这个ppt是NewEdit的项目介绍,有几个图可以看一下:

http://wiki.woodpecker.org.cn/moin/NewEdit?action=AttachFile&do;=get⌖=NewEdit.ppt


--
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月10日 星期四 12:50

andy.bu at kodak.com andy.bu at kodak.com
Thu Nov 10 12:50:58 HKT 2005

 谢谢提醒。。
我已经学会如何使用了!
功能够用。:)呵呵!!

Best Regards,
==============================
Andy Bu

Kodak Health Group
Global R&D; Center (Shanghai)
Eastman Kodak Company

Floor 25, King Tower
28 Xin Jinqiao Road
Shanghai, P.R.China 201206
Tel   :8621-58345678-3100
Mail : Andy.bu at Kodak.com
==============================



Zoom Quiet <zoom.quiet at gmail.com> 
Sent by: python-chinese-bounces at lists.python.cn
2005-11-09 11:18
Please respond to
python-chinese at lists.python.cn


To
python-chinese at lists.python.cn
cc

Subject
Re: [python-chinese] 如何使用pydoc






看来想组织一个成熟可用的开源项目,涉及多方面的知识哪!
http://wiki.woodpecker.org.cn/moin/OpenSourceProjectManage
开辟  开放源代码项目管理 专页!
可以从"项目项目集锦" 导航中找到!
其中很早就组织了两大流行文档化注释工具的使用经验!
http://wiki.woodpecker.org.cn/moin/CodeCommentingRule

大家,请继续讨论,是也乎…………

在 05-11-9,andy.bu at kodak.com<andy.bu at kodak.com> 写道:
>
> 如何使用pydoc生成文档!!
> 有经验的朋友请介绍一下!!
>
>  Best Regards,
>  ==============================
>  Andy Bu
>
>  Kodak Health Group
>  Global R&D; Center (Shanghai)
>  Eastman Kodak Company
>
>  Floor 25, King Tower
>  28 Xin Jinqiao Road
>  Shanghai, P.R.China 201206
>  Tel   :8621-58345678-3100
>  Mail : Andy.bu at Kodak.com
>  ==============================
> _______________________________________________
> Python中文技术讨论邮件列表
> 发言: 发邮件到 python-chinese at lists.python.cn
> 订阅: 发送 subscribe 到 python-chinese-request at lists.python.cn
> 退订: 发送 unsubscribe 到
> python-chinese-request at lists.python.cn
> 详细说明: http://python.cn/mailman/listinfo/python-chinese
>
>


--
# Time is unimportant, only life important!
## 面朝开源,我心自由!
_______________________________________________
PythonÖÐÎļ¼ÊõÌÖÂÛÓʼþÁбí
·¢ÑÔ: ·¢Óʼþµ½ python-chinese at lists.python.cn
¶©ÔÄ: ·¢ËÍ subscribe µ½ python-chinese-request at lists.python.cn
Í˶©: ·¢ËÍ unsubscribe µ½  python-chinese-request at lists.python.cn
Ïêϸ˵Ã÷: http://python.cn/mailman/listinfo/python-chinese

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20051110/5e770fd5/attachment.html

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

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

    你的回复:

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

    Zeuux © 2025

    京ICP备05028076号