一些很重要的知识,个人写得有点乱,也能够去看这些文章python
首先来看一个例子,正常状况下咱们定义而且实例一个类以下3d
class Foo(object): def __init__(self): pass obj = Foo() # obj是经过Foo类实例化的对象
上述代码中,obj 是经过 Foo 类实例化的对象,其实,不只 obj 是一个对象,Foo类自己也是一个对象,由于在Python中一切事物都是对象。code
print type(obj) # 输出: Foo 表示,obj 对象由Foo类建立 print type(Foo) # 输出:type表示,Foo类对象由 type 类建立
若是按照一切事物都是对象的理论:对象是经过执行Foo类的构造方法建立,那么Foo类对象应该也是经过执行某个类的 构造方法 建立。对象
这里和有必要提到一下在Python中有两个最基本的对象,<type ‘object’> 和 <type ‘type’>,这两个对象是全部对象的起源。blog
<type ‘type’>
的类型是<type ‘type’>
(它自己),<type ‘type’>
的父类是<type ‘object’>
继承
<type ‘object’>
的类型是<type ‘type’>
,<type ‘object’>
没有父类图片
在Python对象系统中,<type ‘object’>和<type ‘type’>的关系就像鸡和蛋的关系,不能说谁先于(建立)谁,二者是相互依赖的,共同构成了Python对象系统的基础.有点难理解,不过没有关系,知道有种这么两个东西就行了,比较咱们也不是设计Python的人,没有必要搞的那么清楚.
主要有两种方式,不过本质上都是同样的,都是经过type类来实例一个用户类
普通方式 Python 1 class Foo(object): 2 3 def func(self): 4 print 'hello ' 特殊方式(type类的构造函数) Python 1 def func(self): 2 print 'hello ' 3 4 Foo = type('Foo',(object,), {'func': func}) 5 #type第一个参数:类名 6 #type第二个参数:当前类的基类 7 #type第三个参数:类的成员
由上面能够看出来 , Foo类是由type类实例而来,那么具体的建立的过程是怎么样的呢,接着往下面看:
new 和 __init()和__metaclass__:
__new__函数是实例一个类所要调用的函数,每当咱们调用obj = Foo()来实例一个类时,都是先调用__new__()
而后再调用__init__()函数初始化实例. __init__()在__new__()执行后执行,
类中还有一个属性 __metaclass__,其用来表示该类由 谁 来实例化建立,因此,咱们能够为 __metaclass__ 设置一个type类的派生类,从而查看 类 建立的过程。
mytype产生一个叫作Foo的实例,主要的原理就是设置了,__metaclass__=MyTypoe,这样就指定mytype类来实例foo类,若是Python没有找到__metaclass__,它会继续在(父类)中寻找 __metaclass__属性,并尝试作和前面一样的操做。若是Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试作一样的操做。若是仍是找不到__metaclass__,Python就会用内置的type来建立这个类对象。
mytype类中的__new__方法返回了一个对象,全部的Python实例都是这句代码建立的type.__new__(cls,name,bases,attrs)
mytype的__init__()函数初始化Foo类,在这里咱们能够和在__new__()函数同样设置Foo类的attr属性,好比类中的方法,字段属性等
和Foo类的建立过程同样,studen类继承了Foo类,因此重复123步骤,获得一个studen类
当用户使用Foo()或者studen()来实例类时,会默认调用类中的_new_()方法,要是之类里面没有这个方法就到父类里面寻找__new__(),咱们能够充分利用这个new函数,好比来实现Python中的单例模式,或者对类成员进行批量的修改等等.
产生了一个实例后立刻执行__init__()函数,进行初始化实例,
由上面的运行结果能够看出,其中Foo和studen类的类型是<class '__main__.MyType'>,这也证实了Foo类和studen类都是由MyType实例而来…而第三个例子,能够看出Foo2类的类型是<type 'type'>,这个并不例外,Foo2继承了object类,(这个,仍是跳过吧,前面已经讲过type和object相爱相杀的关系了)
首先,你知道了类实际上是可以建立出类实例的对象。好吧,事实上,类自己也是实例,固然,它们是元类的实例。Python中的一切都是对象,它们要么是类的实例,要么是元类的实例,除了type。type其实是它本身的元类,在纯Python环境中这可不是你可以作到的,这是经过在实现层面耍一些小手段作到的。其次,元类是很复杂的。对于很是简单的类,你可能不但愿经过使用元类来对类作修改。你能够经过其余两种技术来修改类:
Monkey patching
class decora