码迷,mamicode.com
首页 > 编程语言 > 详细

深刻理解Python中的元类(metaclass)--代码实践

时间:2016-07-28 16:09:36      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:

根据http://blog.jobbole.com/21351/所作的代码实践。

这篇讲得不错,但以我现在的水平,用到的机会是很少的啦。。。

#coding=utf-8

class ObjectCreator(object):
    pass

my_object = ObjectCreator()
# print my_object
def echo(o):
    print o

echo(ObjectCreator)
print hasattr(ObjectCreator, new_attribute)
ObjectCreator.new_attribute = foo
print hasattr(ObjectCreator, new_attribute)
print ObjectCreator.new_attribute
ObjectCreatorMirror = ObjectCreator
print ObjectCreatorMirror()

def choose_class(name):
    if name == foo:
        class Foo(object):
            pass
        return Foo
    else:
        class Bar(object):
            pass
        return Bar

print ========================
MyClass = choose_class(foo)
print MyClass
print MyClass()

print ============================
print type(1)
print type("1")
print type(ObjectCreator)
print type(ObjectCreator())
print ==========================
MyShinyClass = type(MyShinyClass, (), {})
print MyShinyClass
print MyShinyClass()
print =========================
Foo = type(Foo, (), {bar:True})
print Foo
print Foo.bar
f = Foo()
print f
print f.bar
print ======================
FooChild = type(FooChild, (Foo,), {})
print FooChild
print FooChild.bar
print ===========================
def echo_bar(self):
    print self.bar

FooChild = type(FooChild, (Foo,),{echo_bar: echo_bar})
print hasattr(Foo, echo_bar)
print hasattr(FooChild, echo_bar)
my_foo = FooChild()
print my_foo.echo_bar()
print =============================
age = 35
print age.__class__
name = bob
print name.__class__
def foo():  pass
print foo.__class__
class Bar(object):  pass
b = Bar()
print b.__class__
print ============================
print age.__class__.__class__
print name.__class__.__class__
print foo.__class__.__class__
print b.__class__.__class__
print ============================

class UpperAttrMetaClass(type):
    def __new__(cls, name, bases, dct):
        attrs = ((name, value) for name, value in dct.items() if not name.startswith(__))
        uppercase_attr = dict((name.upper(), value) for name, value in attrs)
        return super(UpperAttrMetaClass, cls).__new__(cls, name, bases, uppercase_attr)

class Foo(object):
    __metaclass__ = UpperAttrMetaClass
    bar = bip

print hasattr(Foo, bar)
print hasattr(Foo, BAR)
f = Foo()
print f.BAR
    
print ============================

技术分享

深刻理解Python中的元类(metaclass)--代码实践

标签:

原文地址:http://www.cnblogs.com/aguncn/p/5715080.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!