首页 > 编程语言 > 详细

python中元类(metaclass)的理解

时间:2017-10-29 19:16:58      阅读:279      评论:0      收藏:0      [点我收藏+]

一:类也是对象

  类就是一组用来描述如何生成一个对象的代码。

 类也是一个对象,只要你使用关键字class,python解释器在执行的时候就会创建一个对象。

 下面这段代码:

class ObjectCreator(object):
    pass

会在内存中创建一个对象,名字就是ObjectCreator,这个对象(类)自身拥有创建对象(类实例)的能力。

类的本质是一个对象,你可以拷贝它,可以将它赋给一个变量,将它作为参数传递给函数,可以为它增加属性。

以下为实例:

class ObjectCreator(object):
    pass

print(ObjectCreator) #打印一个类

def echo(data):
    print(data)

echo(ObjectCreator) #将类作为参数传递给函数

ObjectCreator.newAttribute = new attr  #为类添加新属性
print(hasattr(ObjectCreator,newAttribute))
print(ObjectCreator.newAttribute)

ObjectCreatorCopy = ObjectCreator #将类复制给一个变量
print(ObjectCreatorCopy)
print(ObjectCreatorCopy())

‘‘‘
输出:
<class ‘__main__.ObjectCreator‘>
<class ‘__main__.ObjectCreator‘>
True
new attr
<class ‘__main__.ObjectCreator‘>
<__main__.ObjectCreator object at 0x0000000001EA9860>
‘‘‘

 

二:动态的创建类

1 通过return class 动态的构建需要的类

类也是对象,所以我们再运行的时候动态的创建它们。在函数体中创建类:

def create_class(name):
    if name == foo:
        class Foo(object):
            pass
        return Foo
    else:
        class Berry(object):
            pass
        return Berry
my_class = create_class(foo)
print(my_class)#返回类
print(my_class())#返回类的实例
    
‘‘‘输出:
<class ‘__main__.create_class.<locals>.Foo‘>
<__main__.create_class.<locals>

2 通过type函数构造类

 上述方法需要你自己编写整个类的代码。由于类也是对象,所以也必须是通过什么东西来生成才对。

内置函数type可以让知道一个对象的类型是什么,like:

class Demo(object):
    pass
print(type(100))
print(type(str))
print(type(Demo))
print(type(Demo()))
‘‘‘
输出:
<class ‘int‘>
<class ‘str‘>
<class ‘type‘>
<class ‘__main__.Demo‘>
‘‘‘ 

另外,type还可以动态的创建类。type可以接收一个类的描述作为参数,然后返回一个类。

type的语法:

type(类名,父类的元组(针对继承的情况,可以为空), 包含属性的字典(名称和值))

比如下面的代码:

class MyclassDemo(object):
    pass
#可以手动通过type创建

MyclassDemo = type(MyclassDemo,(),{}) #返回一个类对象
print(MyclassDemo)
print(MyclassDemo())
‘‘‘
输出:
<class ‘__main__.MyclassDemo‘>
<__main__.MyclassDemo object at 0x000000000213A3C8>
‘‘‘

下面通过一个例子看看type是如何创建类的:

#1 构建Foo类
class Foo(object):
    bar = True
# 使用type构建
Foo = type(Foo, (), {bar: True})
print(Foo)

# 2继承Foo类
class FooChild(Foo):
    pass
# 使用type构建
FooChild = type(Foochild,(Foo,), {})
print(FooChild)
print(FooChild.bar)

# 3为FooChild类增加方法
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()
my_foo.echo_bar()
‘‘‘
输出:
<class ‘__main__.Foo‘>
<class ‘__main__.Foochild‘>
True
False
True
True
‘‘‘

可以看到,在python中

 

python中元类(metaclass)的理解

原文:http://www.cnblogs.com/1zhangwenjing/p/7750620.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!