1.定义
- 元类是类的类,是类的模板
- 元类的实例是类,正如类的实例是对象
- 元类就是创建类的类,函数type就是元类
- python中一切皆对象。包括整数、字符串、函数以及类都是对象,且都是从type类创建而来
- 动态生成类,不能控制类是如何生成的。
- python3中的metaclass可动态创建类
- 很多web框架都会使用metaclass来创建类
- 掌握元类对理解源代码至关重要。比如ORM框架类
通过__class__的魔术方法可以查看到,float、int、str都是type类的子类
类的本质是对象,于是可以对类做如下操作:
(1)可以将它赋值给一个变量
(2)可以拷贝它
(3)可以为它增加属性
(4)可以将它作为函数参数进行传递
2.动态创建类
(1)通过分支语句动态创建类
因为类也是对象,运行时在函数中使用class关键字动态的创建类。当使用class关键字时,python解释器自动创建这个对象。
#通过分支语句动态创建类
def create_class(name):
if name=='foo':
class Foo(object):
pass
return Foo
else:
class Bar(object):
pass
return Bar
cls=create_class(name='fool')
print(cls.__name__) #获取类的方法
结果
Bar
(2)通过type动态创建类
语法格式:
type(类名,父类名称的元组,属性信息的字典)
#通过type动态创建类
def hello(self):
print('hello')
Person=type('Person',(object,),{'country':'china','hello':hello})
p1=Person()
print(p1.country)
p1.hello()
结果
china
hello
(3)自定义元类metaclass
应用场景:Django(ORM)、元类实现单例模式等
元类本身而言,实现的功能是:1.拦截类的创建 2.修改类 3.返回修改之后的类
#通过metaclass自定义元类
class Singleton(type):
"""自定义元类实现单例模式,父类时type"""
cache={}
def __call__(cls):
if cls not in cls.cache:
cls.cache[cls]=super(Singleton, cls).__call__()
# 如果类不在类存储中,则使用父类的__call__方法创建类,这里cls是因为要继承的是类方法,不是实例
return cls.cache[cls]
#创建一个类Person,指定Person的类(元类)是Singleton
class Person(object,metaclass=Singleton):
pass
p1=Person()
p2=Person()
print(p1,p2)
结果
<__main__.Person object at 0x00000246F074D9E8> <__main__.Person object at 0x00000246F074D9E8>
#结果显示创建的是单例模式