python中元类(metaclass)的理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中元类(metaclass)的理解相关的知识,希望对你有一定的参考价值。

一:类也是对象

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

 类也是一个对象,只要你使用关键字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)的理解的主要内容,如果未能解决你的问题,请参考以下文章

对python中元类的理解

python中的元类(metaclass)

深刻理解Python中的元类(metaclass)以及元类实现单例模式

深刻理解Python中的元类(metaclass)

深入理解Python中的元类(metaclass)

[python] 理解metaclass并实现一个简单ORM框架