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)的理解的主要内容,如果未能解决你的问题,请参考以下文章