python中__init__方法、__new__方法、__str__方法、__del__方法、__call__方法详解

一、 python的__init__方法和__new__方法

该方法是python中初始化的方法,也称构造方法。但是它与其他语言中的构造方法不同,它只进行初始化。__new__方法是创建对象的方法。其中具体的细节看下面代码详解。

可以看到定义了一个初始化函数,在创建对象时就被执行了。

class Cat(object):
   def __init__(self):
       print("这是__init__方法")
创建对象
cat=Cat()
输出结果:这是__init__方法

下面给它添加一个__new__函数请看。

class Cat(object):
    def __init__(self):
        print("这是__init__方法")
    def __new__(cls):
        print("这是__new__方法")
继续创建对象对__init__方法进行调用
cat=Cat()
输出结果:这是__new__方法

现在发现函数并没有执行__init__方法,这是因为object类是所有类的基类,在创建对象时都要调用基类中的__new__方法,这里相当于把父类的__new__方法进行了复写。要想它继续执行__init__方法,就要返回父类__new__方法创建出来对象的引用。下面进行修改

class Cat(object):
    def __init__(self):
        print("这是__init__方法")
    def __new__(cls):
        print("这是__new__方法")
        return object.__new__(cls)
创建对象继续调用
cat=Cat()
输出结果:这是__new__方法
        这是__init__方法

现在发现__init__方法被调用了。所以可以看出__init__方法只是做了初始化,而正真创建对象的是__new__方法。
下面对代码进行详细的解释

class Cat(object):
    def __init__(self):
        """
        self:参数来接受刚刚创建的对象cat的引用
        """
        print("这是__init__方法")
    def __new__(cls):
        """
        参数:cls是Cat类指向的对象,也就是cat
        :return:返回值是cat对象的引用:
        print(object.__new__(cls))的结果
        <__main__.Cat object at 0x0000027224657A58>
        """
        return object.__new__(cls)

补充内容: 这里根据__new__方法的创建过程,可以创建单例模式。 单例模式:不管怎么创建只有一个对象,如我们使用的微信界面、QQ界面,你每次打开的时候只有一个主界面。这样的模式就是单例模式。下面用代码说明其中的细节

class Cat(object):

    #控制创建对象的数量
    __instance=None
    def __init__(self,name):
        """
        self:参数来接受刚刚创建的对象cat的引用
        """
        self.name=name
    def __new__(cls,name):
        """
        参数:cls是Cat类指向的对象,也就是cat
        :return:返回值是cat对象的引用:<__main__.Cat object at 0x0000027224657A58>
        """
        if cls.__instance==None:
            cls.__instance=object.__new__(cls)
            print("第一次................")
            return Cat.__instance
        else:
            print("第二次对象指向了第一次创建的那个对象................")
            return Cat.__instance
cat1=Cat("白猫")
print(cat1.name)
cat2=Cat("黑猫")
print(cat2.name)
cat3=Cat("波斯猫")
print(cat3.name)
输出结果:
第一次................
白猫
第二次对象指向了第一次创建的那个对象................
黑猫
第二次对象指向了第一次创建的那个对象................
波斯猫

上面可以看到,我创建了三个对象,但是第二个对象和第三个对象都指向了第一次创建的那个对象,现在可以看到每次都将不同的对象name打印出来。也就是对象初始化了三次,现在让对象只初始化一次。也就是说只要有一个对象被创建出来了,就不需要其他对象名字进行初始化。

class Cat(object):
    #控制创建对象的数量
    __instance=None
    #定义参数判断对象是否是第一次初始化,如果第一次初始化则为false,否在为True
    __Flag=False
    def __init__(self,name):
        """
        self:参数来接受刚刚创建的对象cat的引用
        """
        if Cat.__Flag==False:
            self.name=name
            Cat.__Flag=True

    def __new__(cls,name):
        """
        参数:cls是Cat类指向的对象,也就是cat
        :return:返回值是cat对象的引用:<__main__.Cat object at 0x0000027224657A58>
        """
        if cls.__instance==None:
            cls.__instance=object.__new__(cls)
            print("第一次................")
            return Cat.__instance
        else:
            print("第二次对象指向了第一次创建的那个对象................")
            return Cat.__instance
cat1=Cat("白猫")
print(cat1.name)
cat2=Cat("黑猫")
print(cat2.name)
cat3=Cat("波斯猫")
print(cat3.name)
输出结果:
第一次................
白猫
第二次对象指向了第一次创建的那个对象................
白猫
第二次对象指向了第一次创建的那个对象................
白猫

这里可以看出无论创建几个对象,它都只有一个对象被创建出来,并且只初始化了一次。

上述单例模式是__new__方法的最好体现。

二、python的__str__方法和__del__方法
__str__获取对象的描述信息时自动调用,也即用print(对象名)时输出__str__的信息。

class Cat(object):
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return "这是一只%s"%self.name
cat1=Cat("白猫")
print(cat1)
cat2=Cat("黑猫")
print(cat2)
输出结果:
这是一只白猫
这是一只黑猫

现在将对象cat1赋值给cat2再来看看:

cat1=Cat("白猫")
cat2=cat1
print("cat1",cat1)
print("cat2",cat2)~
输出结果:
cat1 这是一只白猫
cat2 这是一只白猫

可以看出,将cat1的地址给了cat2,所以现在可以理解为,一个对象有两个名字,我们使用del方法将其删除一个,del删除时会调用__del__方法,__del__方法在程序结束和对象死掉的时候会自动执行。 del 用于销毁 Python 对象,即在任何 Python 对象将要被系统回收之时,系统都会自动调用该对象的 __del__方法,下面用代码说明其中的细节

class Cat(object):
    def __init__(self,name):
        self.name=name
    def __del__(self):
        print("执行__del__方法")

cat1=Cat("白猫")
cat2=cat1
del cat1
# del cat2
print("======程序结束======")~
运行结果:
======程序结束======
**执行__del__方法**
现在有两个对象cat1和cat2,如果只删除一个对象cat1那么创建的对象只有在程序完全结束的时候才调用__del__方法进行删除,当用del将两对象都删除时,此时创建的对象也被销毁,所以对象死亡的时候就会调用__del__方法 。输出结果如下:
*执行__del__方法
======程序结束======*

上面也可以看到,del方法删除对象时,只是删除其中一个对象的引用,并不是真正的删除了对象,只有当所有的对象引用都被删除时,对象才会被正真删除。
三、python的__call__方法
首先__call__方法的作用是将创建的实例对象可以当方法用,也就是能够给创建的实例对象穿参数。下面具体看代码

class Cat(object):
    def __call__(self,temp):
        return temp**2
cat1=Cat()
print(cat1(2))
输出结果:4

这个例子可以 看出将对象作为了方法来给它传参数进行计算。换句话,以后要想将对象作为方法,那么__call__方法就能帮你实现。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值