python 一切皆对象

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级别的。


猜你喜欢

转载自blog.csdn.net/weixin_42153428/article/details/80591871
今日推荐