什么是元类?首先我们知道python是一门面向对象的开发语言,在python中万物皆对象,类也是对象。首先我们看下面一段代码,使用class 创建一个类,当我们使用type函数打印类型是class‘type’,type就是一个元类,可以通过元类来创建类。元类就可以创建类的类。
>>> class objectCreate(object):
... pass
...
>>> type(objectCreate)
<class 'type'>
>>>
创建类的几种方式
下面来举例集几种类的创建方式,明白类创建的过程(动态创建类)
# 函数创建,
def create_animal(type):
if type == 'Dog':
# 创建类
class Dog(object):
pass
return Dog
elif type == 'Cat':
class Cat(object):
pass
return Cat
Dog = create_animal("Dog")
print(type(Dog))
dog = Dog()
print(type(dog))
<class 'type'>#类类型
<class '__main__.create_animal.<locals>.Dog'>#对象类型
这里通过调用函数传图不同的参数,来创建不同的类,创建出返回的是类的引用,并不是对象,我们可以通过返回的类来创建对象。
使用Type来动态创建类
type可以根据传入的参数描述,根据具体的需要来动态创建出想要得到的类,传入的参数格式为:
type(类名,元祖(父类名组成,可以是多个,也可以是空),字典(属性名和属性值))
class Test1(object):
pass
Test2 = type("Test2", (object,), {})
print(type(Test1))
print(type(Test2))
#打印结果
<class 'type'>
<class 'type'>
可以看出两种创建方式是相同的效果,说到这里我们大家应该都明白了,原来type就是创建类的一个方法,python用它来创建类,也就是说他是所有类的元类,例如在pyhton中是不是还有int,str...等等类型,int就是用来创建整数的类,而str就是用来创建字符串的类,这里的type也是,他就是python用来创建类的类(元类)。
这里还有一个属性__class__
按照我的理解就是,对象(类,对象,python中类也是对象).__class__输出当前对象的创建对象。
Test2 = type("Test2", (object,), {})
test2 = Test2()
print(test2.__class__)#类
print(Test2.__class__)#对象
#打印出
<class '__main__.Test2'>#Test2类创建
<class 'type'>#type创建
__metaclass__属性的使用
__metaclass__属性作用呢是可以在定义类时为类定制化(传入个性化的设置),也就是说,类的创建时根据你的想法来创建的。之前我们创建类时系统默认创建,而现在我们利用metaclass属性可以根据自己的需求来创建类。他是怎么做到的呢?
# 定义构造类函数
def diy_class(create_calss_name, create_paretns_name, create_new_attr):
# 定义字典属性
newAttr = {}
for name, value in create_new_attr.items():
if not name.startswith("__"):
# 转换属性名首字母大写
newAttr[name.capitalize()] = value
print(newAttr)
return type(create_calss_name, create_paretns_name, create_new_attr)
class Animal(object, metaclass=diy_class):
dog = 'dog'
print(type(Animal))
print(Animal().dog)
打印效果
{'Dog': 'dog'}
<class 'type'>
dog
这里可以看到这个新创建类的类名为Animal,父类为object,属性Dog值为dog。这里就根据自己的设置创建了想要的类。
注意:这里写的是在python3.x中的创建过程,在类名后的括号中写,在python2中可以不再类的括号中写,在下面直接将__mataclass__ = 具体的构建函数名。