|
Size: 870
Comment:
|
Size: 4280
Comment:
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 17: | Line 17: |
= 2004年10月 = 下面是转载limoduo的一些文章.仔细学习一下 == Mix-in技术介绍 == mix-in技术,中文不知道应该如何称呼,但意思好象是混入。它的作用是,在运行期间 ,动态改变类的基类或类的方法,从而使得类的表现可以发生变化。可以用在一个通用类接口中,?br>莶煌难≡袷褂貌煌牡筒憷嗍迪郑卟憷嗖挥梅⑸浠6艺庖皇迪挚梢栽谠诵泄讨卸 懈谋洹S捎谖乙彩歉湛吹剑蠹矣形侍饪梢杂胛医薪涣鳌?a href="http://www2.linuxjournal.com/lj-issues/issue84/4540.html">这就是我看到的文章的链 接。前面的一个贴子,dont cry out loud褪怯胫泄? 下面再详细向大家介绍一下: 有一个类, class foo: pass 我可以定义另外一个类, class foobase: def hello(self): print "hello" 如果我直接调用: >>> obj=foo() >>> obj.hello() 这时你会看到出错。那么我可以这样: >>> foo.__bases__ +=(foobase,) >>> obj.hello() hello 成功了。原理是,每个类都有一个__bases__属性,它是一个tuple,用来存放所有的基类。而且在 运行中,可以动态改变。所以当我们向其中增加新的基类时,再次调用原来不存在的函数,由于基 类中的函数已经存在了,所以这次成功了。 这是一个最简单的应用,可以看到我们可以动态改变类的基类。有几个注意事项要说一下: 1. __bases__是一个tuple,所以增加一个值要使用tuple类型,而单个元素tuple的写法为(foobase,) 2. 类必须先存在。所以,如果想使用这一技术,先要将相关的类的模块导入(import)。 由于mix-in是一种动态技术,以多继承,对象为基础,而python正好是这样的语言,使得在python 中实现这一技术非常容易。 == Mix-in技术介绍(续一) == 前一篇文章,简单地向大家介绍了一下mix-in技术,它实现了基类的动态 增加。这样 我们就可以在运行时,根据选择可以动态地增加基类,从而 实现不同的目的。现在 还有一个问题,就是,在基类与派生类中都有同 名的函数,要如何处理呢? 在Python中,如果派生类中有与基类同名的函数,那么调用函数时,会调 用派生类的函数,而不是基类的函数,可以测试一下: >>> class foobase: def a(self): print "hello" >>> class foo(foobase): def a(self): print "foo" >>> c=foo() >>> c.a() foo 可以看出,执行的是foo类的函数。这样在使用mix-in技术时,如果原来 的类中存在与Mix类中同名的函数,那么Mix类中的函数不会运行,如果 想对其进行替换怎么办呢?方法就是使用getattr()和setattr()函数。当然 还是最简单的,更复杂更通用的以后再讨论。 定义两个类: >>> class foobase: def a(self): print "hello" >>> class foo: def a(self): print "foo" >>> f=getattr(foobase, "a") >>> setattr(foo, "a", f.im_func) #f.im_func会得到真正的函数对象 >>> c=foo() >>> c.a() hello 可以看到,函数被替换了。 注意,使用dir(f)还会看到其它的属性im_class,它表示这个函数属于哪个类, im_self表示属于哪个实例 |
我的日志
就在这里写写日志吧.
2004年9月
9月7日
指南针在这里星期算是启动了,当然目前还是做一些准备工作.翻译Twisted文档是第一件事情了.这几日忙着帮朋友写PHP,翻译的时间少了很多,不过怎么样也要在星期天之前找时间把Low-Level部分翻译完,拖的时间太久了.
写了几天的PHP觉得其实PHP也挺有意思的.
有一些地方和Python比较类似,可能脚本语言都是这样吧,不过我没有涉及过其它的脚本语言,也不好多说什么.教本语言一般都有自己的内存管理机制吧,让写惯C++的我感觉很是爽,少了很多的麻烦事.
昨天看到群里面有人问怎么安装STLPort和Boost.又想起我自己的计划,最近是没有时间弄这个事情了.再等等吧...
2004年10月
下面是转载limoduo的一些文章.仔细学习一下
Mix-in技术介绍
mix-in技术,中文不知道应该如何称呼,但意思好象是混入。它的作用是,在运行期间 ,动态改变类的基类或类的方法,从而使得类的表现可以发生变化。可以用在一个通用类接口中,?br>莶煌难≡袷褂貌煌牡筒憷嗍迪郑卟憷嗖挥梅⑸浠6艺庖皇迪挚梢栽谠诵泄讨卸 懈谋洹S捎谖乙彩歉湛吹剑蠹矣形侍饪梢杂胛医薪涣鳌?a href="http://www2.linuxjournal.com/lj-issues/issue84/4540.html">这就是我看到的文章的链 接。前面的一个贴子,dont cry out loud褪怯胫泄?
下面再详细向大家介绍一下:
有一个类,
class foo:
- pass
我可以定义另外一个类,
class foobase:
- def hello(self):
- print "hello"
如果我直接调用:
>>> obj=foo() >>> obj.hello()
这时你会看到出错。那么我可以这样:
>>> foo.bases +=(foobase,) >>> obj.hello() hello
成功了。原理是,每个类都有一个bases属性,它是一个tuple,用来存放所有的基类。而且在 运行中,可以动态改变。所以当我们向其中增加新的基类时,再次调用原来不存在的函数,由于基 类中的函数已经存在了,所以这次成功了。
这是一个最简单的应用,可以看到我们可以动态改变类的基类。有几个注意事项要说一下: 1. bases是一个tuple,所以增加一个值要使用tuple类型,而单个元素tuple的写法为(foobase,)
2. 类必须先存在。所以,如果想使用这一技术,先要将相关的类的模块导入(import)。
由于mix-in是一种动态技术,以多继承,对象为基础,而python正好是这样的语言,使得在python 中实现这一技术非常容易。
Mix-in技术介绍(续一)
前一篇文章,简单地向大家介绍了一下mix-in技术,它实现了基类的动态 增加。这样 我们就可以在运行时,根据选择可以动态地增加基类,从而 实现不同的目的。现在 还有一个问题,就是,在基类与派生类中都有同 名的函数,要如何处理呢?
在Python中,如果派生类中有与基类同名的函数,那么调用函数时,会调 用派生类的函数,而不是基类的函数,可以测试一下:
>>> class foobase:
- def a(self):
- print "hello"
>>> class foo(foobase):
- def a(self):
- print "foo"
>>> c=foo() >>> c.a() foo
可以看出,执行的是foo类的函数。这样在使用mix-in技术时,如果原来 的类中存在与Mix类中同名的函数,那么Mix类中的函数不会运行,如果 想对其进行替换怎么办呢?方法就是使用getattr()和setattr()函数。当然 还是最简单的,更复杂更通用的以后再讨论。
定义两个类:
>>> class foobase:
- def a(self):
- print "hello"
>>> class foo:
- def a(self):
- print "foo"
>>> f=getattr(foobase, "a") >>> setattr(foo, "a", f.im_func) #f.im_func会得到真正的函数对象 >>> c=foo() >>> c.a() hello
可以看到,函数被替换了。
注意,使用dir(f)还会看到其它的属性im_class,它表示这个函数属于哪个类, im_self表示属于哪个实例
