一、 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__方法就能帮你实现。