1、python中的类
Python2.x 中的类分为两种,一种是所有继承自object的新式类,另外一种是经典类classobj,
新式类的写法:
class A(object): pass
经典类的写法:
class A(): pass
这两种类在除了在多继承的时候,继承查找顺序算法不一致外,并没有其他区别,这里就不再详细说明。当然在python3中已经不存在经典类。
2、类的继承关系
所有的新式类继承自object
所有的经典类继承自 空
每一个类(注意这里是类)都有一个__bases__属性,表示这个类的基类,我们可以用 CLASS.__base__查看一下常用的类:
print bool.__bases__ print int.__bases__ print float.__bases__ print set.__bases__ print list.__bases__ print dict.__bases__ print tuple.__bases__ print str.__bases__ print basestring.__bases__ print A.__bases__
输出结果:
(<type 'int'>,) (<type 'object'>,) (<type 'object'>,) (<type 'object'>,) (<type 'object'>,) (<type 'object'>,) (<type 'object'>,) (<type 'basestring'>,) (<type 'object'>,) (<type 'object'>,)
可以看到,常用类都是继承自object的,也就是说我们常用的都是新式类。object的基类和经典类的基类又是什么?
class B(): pass print B.__bases__ print object.__bases__
输出结果:
()
()
由此可见,新式类和经典类是类继承关系链中的顶层。
3、对象的__class__属性
对于任何一个对象,都可以用__class__属性查看对象所属的类
print (33).__class__ print (33.3).__class__ print (True).__class__ print (['1', '2']).__class__ print ((['1', '2'])).__class__ print ({'a': 'b'}).__class__ print ((3,)).__class__ print ('str').__class__
输出结果:
<type 'int'> <type 'float'> <type 'bool'> <type 'list'> <type 'list'> <type 'dict'> <type 'tuple'> <type 'str'>
小结:到此我们已经把类的继承关系弄清楚了。
1、Python2.x 有两种类,经典类和新式类
2、查看类的基类用__bases__
3、查看对象的所属类用__class__
4、Python中的type
在讲解type之前,先来看一组例子:
a = A() print type(33) print type(33.3) print type(a) print type(int) print type(float) print type(A) print type(object) print type(B)
输出结果:
<type 'int'> <type 'float'> <class '__main__.A'> <type 'type'> <type 'type'> <type 'type'> <type 'type'> <type 'classobj'>
1、首先看前三个,对三个实例对象调用type()方法,输出结果为三个对象的类。
2、接下来四个,对类型调用type()方法,输出结果均为<type ‘type’>
3、最后一个经典类,输出是<type ‘classobj’>
这里最好理解的方法就是,type()返回的是 对象或者类的创建者:
1、 33的创建者是int,33.3的创建者是float,a的创建者是A。
2、所有新式类的创建者为 type
3、经典类的创建者为classobj
在面向对象的说法中,我们最常听到就是一切皆对象。实例是对象,类其实也是对象,实例是由类创建的,那么类又是由谁创建的,Python类的type类作用就在于此,type类是Python里的元类,元类的功能就是创建新的类型。所有的新式类都由元类创建。
特殊的经典类的创建者是classobj。它也是一种元类。
type()函数就是拿到类或者对象的创建者。
提示:如果对元类不了解的可以查看Python相关元类的知识。