精华内容
下载资源
问答
  • 1、什么是析构函数新鲜事物,我喜欢。定义:实例销毁的时候调用的函数2、玩一玩例子class Dog(object):'''描述狗'''def __init__(self,name):self.name=namedef eat(self,food):print("%s eating %s" %(self.name,...

    1、什么是析构函数

    新鲜事物,我喜欢。

    定义:在实例销毁的时候调用的函数

    2、玩一玩例子

    class Dog(object):

    '''

    描述狗

    '''

    def __init__(self,name):

    self.name=name

    def eat(self,food):

    print("%s eating %s" %(self.name,food))

    def __del__(self):

    print("del ....object,%s 挂了" %self.name)

    d=Dog("小犬纯一郎")

    del d

    #输出

    del ....object,小犬纯一郎 挂了

    ①析构函数什么时候调用呢?

    其实每一个对象都是一个应用,就像每一个房间都有门牌号一样, 只要这个对象的引用被清空时,就会自动执行,就像上面的del d,其实python中有自动垃圾回收机制,会定时去的去回收一些被清空的应用,而析构函数就是在引用被清空之后会自动执行

    ②析构函数的作用?

    比如说server端接受很多客户端的连接,当你手动屏蔽你的sever端的时候,这个时候客户端还在正常的连接,如果sever端用类写的,你就可以delete server端的同时,在__del__()写一些东西,说去close掉很多客户端的连接。说白了,析构函数就是做一些程序的收尾工作。

    展开全文
  • 解决方案-关于python在析构函数中无法使用open函数 class Test: def __init__(self): print("__init__") def main(self): print("main") def __del__(self): with open("test.txt", "w") as f: f.write(...

    解决方案-关于python在析构函数中无法使用open函数

    class Test:
        def __init__(self):
            print("__init__")
        def main(self):
            print("main")
        def __del__(self):
            with open("test.txt", "w") as f:
                f.write("hhhhh")
            print("__del__")
    
    t = Test()
    t.main()
    
    

    会报错 NameError: name ‘open’ is not defined

    python2没有这个问题

    以下列出的一些解决方案和看法,但造成错误的具体/根本原因目前还未知
    本文围绕该问题初步探究Python垃圾清理的机制

    解决方案一 try …except …finally

    情景: 我的需求是在对象销毁时, 要在文件中进行一个记录

    解决: 使用 try...except...finally...
    
    try:  # 在Test类中移除open()函数, 实例化对象交由try
        t = Test()
        t.main()
    except Exception as e:
        print(e)
    finally:  # open()函数交由finally
        with open("test.txt", "w") as f:
            f.write("20201214")
    

    解决方案二 转移open()函数

    在__del__中无法使用open()函数, 将open()转移到其它对象方法中, 最后在析构函数中关闭

    class Test:
        def __init__(self):
            print("__init__")
        def main(self):
            print("main")
            self.file = open("test.txt", "w")
            
        def __del__(self):
            self.file.write("helloworld")
            print("__del__")
            self.file.close()
    
    t = Test()
    t.main()
    

    解决方案三 使用atexit模块

    在百度和必应中搜寻无果, 果然还是google更加强大!

    为解决这一问题, 我们可以首先导入atexit模块, 然后将析构操作写入另一个函数中, 最后用atexit.register来注册这个函数. 比如, 以上程序可以改写如下:

    import atexit
     
    class 存储代理:
    	def __init__(self):
    		atexit.register(self.cleanup)
    		print("开始")
     
    	def cleanup(self):
    		print("打开文件前")
    		with open("./测试.txt", "w") as 文件:
    			pass
    		print("打开文件后")
        def __del__(self):
            pass
     
    代理 = 存储代理()
    
    atexit模块
    atexit-允许程序员定义在正常程序终止时执行的多个退出函数。 at exit python atexit 模块定义了一个 register 函数,用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作。

    atexit 按注册的相反顺序执行这些函数; 例如注册A、B、C,在解释器终止时按顺序C,B,A运行。

    Note:如果程序是非正常crash,或者通过os._exit()退出,注册的退出函数将不会被调用。

    atexit.register(func, *args, **kargs)
    

    将func作为要在终止时执行的函数。任何要传递给func的可选参数必须作为参数传递给register() 。可以多次注册相同的函数和参数。

    当程序退出的时候,按先进后出的顺序调用注册的函数。如果退出函数在执行过程中抛出了异常,atexit会打印异常的信息,并继续执行下一下回调,直到所有退出函数执行完毕,它会重新抛出最后接收到的异常。

    一.通过装饰器使用atexit

    from atexit import register
    def main():
        print('Do something.')
    
    @register
    def _atexit():
        print('Done.')
        
    if __name__ == '__main__':
     main()
    

    输出: Do something

    ​ Done

    二.非装饰器方式

    from atexit import register
    def main():
        print('main')
    def goodbye(name, adjective):
        print('Goodbye, %s, it was %s to meet you.' % (name, adjective))
      
    register(goodbye, 'Donny', 'nice')
    # register(goodbye, adjective='nice', name='Donny')
    if __name__ == '__main__':
    	main()
    

    输出: main
    Goodbye, Donny, it was nice to meet you.

    解决方案五 显式del

    class Test:
        def __init__(self):
            print("__init__")
        def __del__(self):
            with open("xianshi.txt", "w") as f:
                f.write("ffff") 
    
    t = Test()
    del t
    
    基于本例的问题探究

    dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。

    所以, 利用dir()函数, 我想探究在析构函数中到底减少了哪些方法和属性

    class Test:
        def __init__(self):
            print(dir(__builtins__), len(dir(__builtins__)))
            print("__init__")
    
        def __del__(self):
            print("---del---")
            print(dir(__builtins__), len(dir(__builtins__)))
            print("---del---")
            with open("test.txt", "w") as f:
                f.write("ffff") 
    
    t = Test()
    # del t
    

    结果分析: 在__init__(self)中, 内建属性和方法有153个, 然而在__del__中只有146个, 减少了7个

    我使用集合经行相减后发现, 缺失的内建有

    {'quit', 'license', 'credits', 'exit', 'help', 'open', 'copyright'}
    

    在交互式的python中, 内建属性方法有154个

    如果上述代码的第14行取消注释, 在析构函数中的内建属性和方法仍然有153个

    个人看法
    如果手动del对象, 此时python内的资源还健全,

    要是等到python解释器来清理, 它已经清理了太多资源,所以当执行到一些已清理的资源时便会报错

    解决方案六

    class Iam(object):
    
        def __init__(self):
            print("I m born")
    
        def __del__(self):
            #"open" function still in __builtins__ 
            f = open("memory_report.txt", "w")
            f.write("He gone safe")
            f.close()
    
    def write_iam():
        print("----")
    	i=Iam()
        print("====")
    
    if __name__ == '__main__':
        write_iam()
        print("Script Ends. Now to GC clean memory")
    

    主体程序结束后才调用 Iam类__del__方法,而不是当 i超出 write_iam的作用域时就去立即调用__del__方法。

    原理如下:

    Python 采用的是引用计数机制为主, 标记-清除和分代收集两种机制为辅的策略。 因此, 当 Python 在超出范围时不会清理它,只有当它的最后一次引用超出范围时, 才会将它清理掉。
    展开全文
  • Python(析构函数)

    2017-08-16 22:34:41
    在Python的对象中,也存在构造函数(__init__)和析构析构函数(__del__)。...在Python中定义下面一个类class A: def __init__(self): print("initialization") def my_print(self): print("my_print")

    在Python的对象中,也存在构造函数(__init__)和析构析构函数(__del__)。这里简单说一下Python的析构函数的机制。

    在Python中定义下面一个类

    class A:
        def __init__(self):
            print("initialization")
        def my_print(self):
            print("my_print")
        def __del__(self):
            print("delete")

    运行时,通过下面这样的赋值:

    >>>a1 = A()
    initialization
    >>>a2 = a1 
    >>>a3 = a1

    在Python中,如果只对 a1 进行析构del a1,那么对象并没有被析构掉,只有将对象和引用都析构,才会调用析构函数。

    >>>del a1
    >>>del a2
    >>>del a3 //a1 a2 a3 顺序无要求
    delete

    如果这里有:

    >>>a1 = A()
    initialization
    >>>a2 = a1 
    >>>a3 = a1
    >>>a4 = a1.my_print()
    >>>>del a1
    >>>del a2
    >>>del a3 
    delete
    >>>a4
    >>>

    这时候 a4 存在,但返回类型为 ‘NoneType’。

    展开全文
  • 参考链接: Python中的析构函数 ...在Python中定义下面一个类 class A: def __init__(self): print("initialization") def my_print(self): print("my_print") def __del__(self): ...

    参考链接: Python中的析构函数

    在Python的对象中,也存在构造函数(__init__)和析构析构函数(__del__)。这里简单说一下Python的析构函数的机制。 

    在Python中定义下面一个类 

    class A:

        def __init__(self):

            print("initialization")

        def my_print(self):

            print("my_print")

        def __del__(self):

            print("delete") 

    运行时,通过下面这样的赋值: 

    >>>a1 = A()

    initialization

    >>>a2 = a1 

    >>>a3 = a1 

    在Python中,如果只对 a1 进行析构del a1,那么对象并没有被析构掉,只有将对象和引用都析构,才会调用析构函数。 

    >>>del a1

    >>>del a2

    >>>del a3 //a1 a2 a3 顺序无要求

    delete 

    如果这里有: 

    >>>a1 = A()

    initialization

    >>>a2 = a1 

    >>>a3 = a1

    >>>a4 = a1.my_print()

    >>>>del a1

    >>>del a2

    >>>del a3 

    delete

    >>>a4

    >>> 

    这时候 a4 存在,但返回类型为 ‘NoneType’。

    展开全文
  • Python中有两个特殊的方法, 一个是构造方法__init__, 另一个是析构方法__del__.构造方法__init__,具有初始化的作用,也就是当该类被实例化的时候就会自动执行该函数。那么通常就可以把要先初始化的属性放到这个方法...
  • 逛hacker news的时候看到《Safely using destructors...看了这篇文章差不多清楚了在Python中到底怎样使用析构函数。作者: Eli Bendersky原文链接:https://eli.thegreenplace.net/2009/06/12/safely-using-destructo...
  • 构造函数——————— __init__( self )析构函数——————— __del__( self )不像c++中那样构造函数和析构函数是类名字。并且在python中这构造函数和析构函数可以省略。先看简单的例子:class Simple:def __...
  • #构造函数对象被创建是自动调用的方法,用来完成初始化操作classTest(object):def __init__(self, name):self.name=nameprint('这是构造函数')defsay_hi(self):print('hell, %s' %self.name)def __del__(self):...
  • 构造函数--------------------- __init__( self )析构函数--------------------- __del__( self )不像c++中那样构造函数和析构函数是类名字。并且在python中这构造函数和析构函数可以省略。先看简单的例子:class...
  • python析构函数

    千次阅读 2018-06-11 17:36:34
    python析构函数 析构函数,这样类实例所占内存被回收时,系统就会自动调用析构函数。通常,我们会在析构函数中做一些“清理”工作,比如释放资源,关闭连接,或者发送一个网络包到其它服务以告知其状态变化等等。...
  • 戳上方蓝字关注我们吧本文转载自360云计算(订阅号id:hulktalk),经平台同意授权转载。...析构函数是 C++ 中一个非常重要的概念,析构函数 ( destructor ) 与构造函数相反,当对象结束其生命周期,如...
  • 在Python中析构函数不像在c++中那么需要,因为Python有一个垃圾收集器,可以自动处理内存管理。__del__()方法在Python中称为析构函数方法。当对对象的所有引用都已被删除时即当一个对象被垃圾回收时,将调用该函数...
  • 逛hacker news的时候看到《Safely using destructors...看了这篇文章差不多清楚了在Python中到底怎样使用析构函数。作者: Eli Bendersky原文链接:https://eli.thegreenplace.net/2009/06/12/safely-using-destructo...
  • 构造函数__init__( self )**析构函数__del__( self )**不像c++中那样构造函数和析构函数是类名字。并且在python中这构造函数和析构函数可以省略。先看简单的例子:class Simple: def __init__( self ):passdef __del...
  • 在Python中安全使用析构函数

    千次阅读 2018-12-07 11:49:27
    作者: Eli Bendersky 原文链接:https://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python ...C++析构函数是一个非常重要的概念,它们是RAII(resource acquisition i...
  • 在Python中析构函数不像在c++中那么需要,因为Python有一个垃圾收集器,可以自动处理内存管理。del()方法在Python中称为析构函数方法。当对对象的所有引用都已被删除时即当一个对象被垃圾回收时,将调用该函数。 ...
  • Python解决析构函数__del__不能使用open方法的问题 之前默认以为python的open方法用存哪里都没什么区别的,然后昨天直接"__ del __()"跑程序时反馈程序报错“Python3 NameError: name ‘open’ is not defined”...
  • Python3析构函数

    千次阅读 2018-10-11 17:12:03
    析构函数  析构函数:__del__(self)  程序全部结束时自动结束,当程序无法结束时该函数也不会执行。  执行时间:1.如果该析构函数是全局,则程序结束自动执行  2.如...
  • python中的特殊方法,其中两个,构造函数和析构函数的作用:比说“__ init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数。那么我们就可以把要先初始化的属性放到这个函数里面。...
  • Python中有两个特殊的方法, 一个是构造方法__init__, 另一个是析构方法__del__.构造方法__init__,具有初始化的作用,也就是当该类被实例化的时候就会自动执行该函数。那么通常就可以把要先初始化的属性放到这个方法...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 223
精华内容 89
关键字:

在python中析构函数

python 订阅