当前位置:首页 > 开发 > 编程语言 > Ruby > 正文

使用 python 模拟 ruby 的 open class

发表于: 2007-01-27   作者:huangyiiiiii   来源:转载   浏览:
摘要: 老早就写了这些代码,但一直懒得为它写篇博客,我觉得我永远也无法理解为什么会有人发明这种奇怪的东西。 不过终于还是决定写一篇吧,多一点有意思的代码也许能吸引更多人对 python 的兴趣呢,呵呵。虽然我对 ruby 的这个东西有许多贬义词想说,不过想想既然有人用,也就应该有其理由吧。 且看代码: def update( klass, bases, attrs ): for k,v
老早就写了这些代码,但一直懒得为它写篇博客,我觉得我永远也无法理解为什么会有人发明这种奇怪的东西。
不过终于还是决定写一篇吧,多一点有意思的代码也许能吸引更多人对 python 的兴趣呢,呵呵。虽然我对 ruby 的这个东西有许多贬义词想说,不过想想既然有人用,也就应该有其理由吧。
且看代码:

def update( klass, bases, attrs ):
for k,v in attrs.items():
if not k.startswith('__') or not k.endswith('__'):
setattr(klass, k, v)
if bases:
klass.__bases__ = bases
return klass

class Meta(type):
def __new__(cls, klass, bases, attrs):
try:
return update( globals()[klass], bases, attrs )
except KeyError:
return type.__new__(cls, klass, bases, attrs)

# test
__metaclass__ = Meta

# test simple
class A:
def say(self):
print 'hi'

a = A()
a.say() # hi

class A:
def say(self):
print 'ho'
def new_func(self):
print 'new'

a.say() # ho
a.new_func() # new

# test inherit
#del A
#class A:
#def say(self):
#print 'hi'

#a = A()
#a.say() # hi

#class B:
#def say(self):
#print 'ho'

#class A(B):
#def say(self):
#super(A, self).say()

#a.say() # ho

update: 很遗憾,测试发现 new style class 貌似还有个 bug 。所以把后面部分注释了先,不知道 python2.5 怎么样。

使用 python 模拟 ruby 的 open class

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号