一、python中的对象
1、python中对象种类及关系
<type 'type'>:该对象可以成为其他类的类型,python中几乎所有对象都是直接或间接由<type 'type'>创建,我们称这种特殊的对象为metaclass对象,即元类。
<type 'object'>:现在的python中所有的类都必须直接或间接继承自该对象。
class对象:系统内置或自定义对象,通过<type 'type'>被创建,即我们通常所说的类。
instance对象:由class对象实例化得到,即我们通常所说的对象。
所有class对象都继承自<type 'object'>,类的类型也都为<type 'type'>。所以class对象既可以作为class对象用来生成instance对象,也是instance对象。
注:class对象既然是instance对象,那么它也应该跟一般的instance对象一样可被调用。
class A():
def __call__(self):
print 'Hello World'
a = A()
a() #Hello World
可调用性:在python中通过__call__方法决定是否可以调用,在class对象中实现了__call__方法,则class对象也如同instance对象一样可被用。
2.新式类、旧式类
产生原因:旧式类中自定义class对象无法继承系统内置的class对象。
新/旧类的区别: 1.新式类相同父类只执行一次构造函数,经典类重复执行多次。
2.新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索。
3.新式类解决无法继承内置class对象的方法
在定义object时添加了一个tp_dict域,用以解决旧式类存在的问题。当python启动后,根据object对象对内置对象进行完善,当自定义对象时通过继承object对象。从而实现内置对象与自定义对象的一致性。
二、类的实现
1、<type 'object'>在创建类时的作用
处理基类:在python中存在一个概念 —— __slot__,在__solt__中存储着object中定义的操作名,在python运行后__slot__中存储的操作名根据地址偏移等找到实际的操作,将操作存储在tp_dict中。
__slots__:通过定义一个特殊的__slots__
变量,来限制该class能添加的属性。
class Student(object):
__slots__ = ('name', 'age')
继承的实现:1、设置type信息、基类及基类列表
2、填充tp_dict
3、基于mro列表从基类继承操作
4、设置子类列表
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
注:python为多继承,在子类中需调用父类的__init__方法,对父类进行初始化。
2、<type 'type'>在创建的作用
class元信息 = 动态元信息 + 静态元信息
动态元信息:即为class的属性、方法等,在代码动态运行时确定。
静态元信息:定义了所有对象如何创建,分配内存大小等。通过<type 'type'>确定。即metaclass。
class的创建过程:1、解析出类名、基类列表和属性表。
2、确定最佳的mateclass和base(<type 'type'>、<type 'object'>)。
3、为class对象分配所需的内存空间。
自定义元类,代替<type 'type'>创建对象:
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs) class MyList(list):
__metaclass__ = ListMetaclass
3.python中的私有化
私有化:python并不提供真正意义上的私有化支持,变量或方法加_实际是改变了其访问名称,增加了访问难度。
__func__:表示为魔法方法,在特定时候python虚拟机自动调用。
__func:双下划线开始的属性会在解释时在前面加上下划线和类名,如self.__num
会被解析为self._className__num。
_func:用以标记该方法或属性为私有,不应该在作用域范围之外被访问。
三、类的实例化
1、instance对象的创建
从class到instance:1、instance = class.__new__(class,args,kwds)调用type中的方法分配内存空间。
2、class.__init__(instance,args,kwds)对分配的空间进行初始化操作。
注:若没有定义__init__则会调用object的__init__。
创建class与创建instance对象空间分配的不同:分配的空间大小不同,创建instance时创建的空间需要加上基类的空间。
<type 'type'>在创建instance对象中的作用:<type 'type'>在创建instance对象过程中用来进行分配内存。