python之魔术方法

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)

 

 

原文:https://www.yuque.com/zaygee/xrp5b2/qg7c6s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值