python 一切皆对象
在python中有一句话“一切皆对象”,其实在刚开始接触python的时候对这句话完全不理解,即使是看完了python基础教程也没有很好的理解这句话的含义。直到看了python的源码才对这部分有了更深入的理解。我的入门指导书是《Python源码剖析深度探索动态语言核心技术》。
在python中下列语句其实都是一个共同点:
- 1
- 2
i = 1
s = "abcde"
def foo(): pass
class C(object): pass
instance = C()
l = [1,2]
t = (1,2)
他们在python解释器中执行的时候,都会在堆中新建了一个对象,然后把新建的对象绑定到变量名上。
i = 1 -----新建一个PyIntObject对象,然后绑定到i上
s = "abcde" -----新建一个PyStringObject对象,绑定到s上
def foo(): pass -----新建一个PyFunctionObject对象, 绑定到foo上
class C(object): pass -----新建一个类对象,绑定到C上
instance = C() -----新建一个实例对象,绑定到instance上
l = [1,2] -----新建一个PyListObject对象,绑定到l上
t = (1,2) -----新建一个PyTupleObject对象,绑定到t上
- 1
- 2
- 3
- 4
- 5
- 6
- 7
但是有一些是例外,他们就是python中的内建对象,比如PyInt_Type,PyString_Type,PyList_Type,他们都是全局变量,在代码中已经静态的初始化了这些类型的实现,但是这些全局变量都还要通过PyType_Ready的初始化才算真正初始化完成。
对象创建的控制
好吧,既然都是对象,那么class对象的创建(如上面例子中的C)和实例对象(如上面例子中的instance)的创建有什么不同呢?
个人觉得<type 'type'>
是完成了对class对象的创建控制,而实例对象的创建主要是通过 <type 'object'>
控制的。下面这张图就比较好的体现了type和object之间的关系,<type 'type'>
是所有类的metaclass,而新的class都是继承于<type 'object'>
,是所有类的父类,而a就是 class A的实例。
当然在代码中我们也可以控制对象创建的过程:
class Meta(type):
def __getattribute__(*args):
print"Metaclass getattribute invoked"
return type.__getattribute__(*args)
class C(object):
__metaclass__ = Meta
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(C, cls).__new__(cls)
return cls.instance
def __getattribute__(*args):
print "Class getattribute invoked"
return super(C, self).__getattribute__(*args)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
在代码中__metaclass__
实现了对class创建的控制,而__new__
实现了对实例创建的控制,因此__new__
方法应是算是class级别的。还有一个__init__
方法是对每个实例的初始化,所以这个方法应该算是instance级别的。