在Python当中万物皆对象,我们用class关键字定义的类本身也是一个对象,负责产生该对象的类称之为元类,元类可以简称为类的类,元类的主要目的是为了控制类的创建行为.
type是Python的一个内建元类,用来直接控制生成类,在python当中任何class定义的类其实都是type类实例化的结果。
只有继承了type类才能称之为一个元类,否则就是一个普通的自定义类,自定义元类可以控制类的产生过程,类的产生过程其实就是元类的调用过程.
在python中使用关键字class,python解释器在执行的时候就会创建一个对象。如下:
class Test(object):
pass
这个对象的名字就是Test,而这个对象(类)拥有创建对象的能力,这就是为什么他是一个类的原因
一个类由三大组成部分,分别是
1、类名class_name
2、继承关系class_bases
3、类的名称空间class_dict
方式1:使用class关键字(python解释器转化为第二种)
方式2:通过type关键字,依次传入以上三个参数即可。
我们正常定义类是这样写的:
class Person(object):
country = 'China'
def __init__(self,name,age):
self.name = name
self.age = age
def tell(self):
print('%s 的年龄是:%s'%(self.name,self.age))
我们可以通过第二种方式创建类:
country = 'China'
def __init__(self,name,age):
self.name = name
self.age = age
def tell(self):
print('%s 的年龄是:%s'%(self.name,self.age))
Person = type('Person',(object,),{'country':country,
'__init__':__init__,
'tell':tell})
print(Person.__dict__)
person = Person('wtt',25)
print(person.__dict__)
Person类实际上就是一个类对象,于是我们将产生类的类称之为元类,默认的元类是type.
我们所说的元类都是指type这个元类,但是用户是可以自定义元类的,只要继承type就可以
class MyMetaClass(type):
pass
country = 'China'
def __init__(self,name,age):
self.name = name
self.age = age
def tell(self):
print('%s 的年龄是:%s'%(self.name,self.age))
Person = MyMetaClass('Person',(object,),{'country':country,
'__init__':__init__,
'tell':tell})
print(Person.__dict__)
person = Person('wtt',25)
print(person.__dict__)
我们也可以用这种日常的形式:
class MyMetaClass(type):
pass
class Person(object,metaclass=MyMetaClass): #自定义元类,来创建类.
country = 'China'
def __init__(self,name,age):
self.name = name
self.age = age
def tell(self):
print('%s 的年龄是:%s'%(self.name,self.age))
print(Person.__dict__)
person = Person('wtt',25)
print(person.__dict__)
摘要:
1.在python中要查看某一个类的父类可以使用它的__base__属性查看
2.要查看某一对象是属于哪一个类可以使用__class__属性查看
3.object是所有父子关系类的顶端也就是根类,所有数据类型的父类都是object
4.type是类型关系的顶端,所有的对象都是type的实例
1.print(type.__base__) # object是type的实例
<class 'object'>
2.print(type.__class__)
<class 'type'>
3.print(object.__base__) # 此处可看到object父类为空,即没有比它位置更高的类
None
4.print(object.__class__)
<class 'type'>
5.class Demo:
pass
print(Demo.__base__)
print(Demo.__class__)
<class 'object'>
<class 'type'>
f = Demo()
print(f.__class__)
<class '__main__.Demo'>
由以上结果可得出:
1.object是type的实例
2.type是type的实例,type的父类是object
3.object没有父类
4.Demo的父类是object,Demo是type的实例
# 定义元类(metaclass)
class Demo(type):
pass
print(Demo.__base__)
print(Demo.__class__)
<class 'type'>
<class 'type'>
Demo继承了type,Demo既是type的子类,又是type的实例
class TestDemo(metaclass=Demo):
pass
print(TestDemo.__base__)
print(TestDemo.__class__)
<class 'object'>
<class '__main__.Demo'>
TestDemo是object的子类,是元类Demo的实例
总之:
1.object是一个type的实例,type继承自object
2.类最终都是type的实例化而来,因此,元类就是创建类这种对象的东西。
3.Python中的一切都是对象,它们要么是类的实例,要么是元类的实例,除了type