python之魔术方法
构造函数
是一种特殊的方法。主要用来在创建对象时初始化对象
析构函数
析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作
构造函数__init__()
实例化对象后自动触发,在__new__之后执行,且无返回值
构造函数__new__()
实例化对象时触发,在__init__之前执行,
参数:cls必填,代表要实例化的类
返回值:必须返回值,返回实例化出来的实例,实例化对象取决于__new__方法返回了什么东西
class Foo:
def __init__(self):
print("我是init方法")
def __new__(cls, *args, **kwargs):
print('我是new方法')
r = super(Foo, cls).__new__(cls)
return r
obj = Foo()
print(obj)
-------------------
#我是new方法
#我是init方法
#<__main__.Foo object at 0x0000024666434BC8>
- 如果要得到当前类的实例,应当在当前类中的__new__()方法语句中调用当前类的父类的__new__()方法
- 如果当前类是直接继承object,当前类的__new__()方法返回的对象应该为:
def __new__(cls, *args, **kargs):
...
return object.__new__(cls)
析构方法 __del__()
对象被系统回收的时候自动触达(del不一定触发),无返回值
class Foo:
def __init__(self):
print("我是__init__")
def __new__(cls, *args, **kwargs):
print('我是new方法')
r = super(Foo, cls).__new__(cls)
return r
def __del__(self):
print("我是__del__")
--------------------------------------------------------------------------
obj = Foo() # 实例化对象后触发__new__(),返回实例化对象,再触发__init__()
obj2 = obj
del obj #不会触发__del__,__del__总是会在程序的最后触发
print("测试是否是最后执行")
-----------------------
#我是new方法
#我是__init__
#测试是否是最后执行
#我是__del__
__call__()
当对象像函数一样可以被调用,就相当于是调用它的__call__()方法
class C(A, B):
def __init__(self):
print("enter C")
super(C, self).__init__()
print("leave C")
def __call__(self, *args, **kwargs):
print("我是call方法")
c = C()
c() 当对象实例被调用==调用对象call方法
-----------
#enter C
#leave C
#我是call方法
__str__()
返回对象的描述信息
class C(A, B):
def __init__(self, name):
self.name = name
print("enter C")
super(C, self).__init__()
print("leave C")
def __str__(self):
return "我叫{}".format(self.name)