Python中对象的创建与销毁 以及单例类工厂模式相关简述


文章参考: https://www.cnblogs.com/zhangchaoyang/articles/4984768.html

对象的创建

关于__new__ 和 init

在python的类中__new__方法先于__init__方法执行
__new__可以理解为类的实例方法,属于类级别的方法
__init__可以理解为类的初始化方法,属于对象(实例)级别的方法
因此在python中使用类,是用__new__来创建对象,实例对象之后会立即调用__init__方法来对对象属性进行变量初始化,或动态添加对象属性并赋值。
需要注意的是,在重写 new 方法与 init 方法的参数应该保持一致

class Student(object):

    cnt = 0  # 用于记录该类的实例创建了多少个

    def __new__(cls, *args, **kwargs):
        print '__new__'
        cls.cnt += 1
        return super(Student, cls).__new__(cls, *args, **kwargs)

    def __init__(self):
        print '__init__'
        self.name = 'ELE' + str(self.cnt)


if __name__ == '__main__':
    inst1 = Student()
    print 
    inst2 = Student()
    print inst2.name
    print Student.cnt

输出结果

__new__
__init__

__new__
__init__
ELE2
2

关于__call__

关于 call 方法,不得不先提到一个概念,就是可调用对象(callable),我们平时自定义的函数、内置函数和类都属于可调用对象,但凡是可以把一对括号()应用到某个对象身上都可称之为可调用对象,判断对象是否为可调用对象可以用函数 callable
如果在类中实现了 call 方法,那么实例对象也将成为一个可调用对象。
此处参考:https://www.jianshu.com/p/e1d95c4e1697
个人理解可以理解为调用对象的__call__方法,相当于是__call__重载了小括号运算符

对象的销毁

python是垃圾自动回收的,不需要我们显式的销毁对象,当没有引用指向内存中的对象时,即引用计数为0时自动销毁。
当执行del obj时会调用对象的__del__方法, 这时对象的引用计数会减1,当对象的引用计数为0时,对象会被销毁,内存就会被回收。
代码解释如下:

import gc

class A(object):

    def __init__(self):
        self.large_list=[i for i in xrange(10000000)]

    def __del__(self):
        print "__del__"

@profile
def foo():
    a=A()
    b=a
    del b
    del a
    gc.collect()
    print

if __name__ == 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值