zoukankan      html  css  js  c++  java
  • python实例化对象过程

    python实例化对象过程

    Python中存在着一种静态的__new__()方法,通常在定义类时不会重写__new__()方法,于是Python在调用类时会自动寻找该类的继承对象(本例中为Object),然后返回当前类的实例对象:

    def __new__(cls, *args, **kwargs):
        ...
        return object.__new__(cls)  #执行object的__new__()函数

    执行object的__new__()函数后会返回实例对象(self),然后将self作为第一个参数传给该类的初始化方法__init__()方法。这里self只是实例对象的一个名字,也是Python里约定俗成的一种叫法,可以自定义其名称。

    当运行c1 = Myclass(11)代码时其实做了两个动作:

    class Myclass(object):
        def __init__(self, x):
            self.x = x
         
    c1 = Myclass(11)                   #相当于隐式执行了__new__()和__init()
    c2 = Myclass.__new__(Myclass, 12)  #显式调用__new__(),返回c2对象
    c2.__init__( 12)                   #显示调用__init(),完成c2的初始化
    print c1.x, c2.x

    输出: 11 12

    __new__和__metaclass__

    在python中,一切皆对象,我们定义的类其实。。。也是一个对象,那么,类本身是谁的对象呢?在python2.2之前(或者叫经典类中),所有的类,都是class的对象,但是在新式类中,为了将类型(int,str,float等)和类统一,所以,所有的类都是type类型的对象。当然,这个规则可以被修改,在类中有一个属性 __metaclass__ 可以指定当前类该由哪个类进行实例化而创建对象过程中,其实构造器不是__init__方法,而是__new__方法,这个方法会返回一个对象,这才是对象的构造器。

    下面是一个解释类实例化对象内部实现过程的代码段:

    class Mytype(type):
        def __init__(self, what, bases=None, dict=None):
            super(Mytype,self).__init__(what, bases, dict)
        def __call__(self, *args, **kwargs):
            obj=self.__new__(self)
            self.__init__(obj, *args, **kwargs)
            return obj
    class Foo:
        __metaclass__=Mytype
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def __new__(cls, *args, **kwargs):
            return object.__new__(cls)
    obj=Foo("xiaoming",18)
    print(obj.name,obj.age)
    执行结果:xiaoming
    18
  • 相关阅读:
    团队项目-第一阶段冲刺-5
    用户场景分析
    第九周总结
    团队项目-第一阶段冲刺-3
    团队项目-第一阶段冲刺-2
    团队项目-第一阶段冲刺-1
    个人工作任务认领
    实验一:个人博客
    MFC onpaint() ondraw()
    MFC 虚函数与消息映射区别
  • 原文地址:https://www.cnblogs.com/111testing/p/13660863.html
Copyright © 2011-2022 走看看