前言
- 当然选择后者啊,这还用说的?
- 好吧,还是说说吧
正文
- 有那么一段时间,我习惯于用_ init_()方法来初始化连接,打开,准备等操作;使用__del__()方法做销毁操作。
- 我是一直知道其弊端的:不就是循环引用和实例多引用致使无法正常销毁实例嘛!
- 简单的使用这种方式,一般情况是遇不到什么问题的,但当业务变得越来越复杂的时候,就会发现会出现莫名奇妙的问题,比如:1、某个操作会卡死在_ del_()方法的执行上面;2、程序抛出了莫名奇妙的异常,然后通过_ del _()默认的处理方式:sys.stderr。
- 这个时候你就会想起在类中实现一个_ enter_()和_ exit _()方法了。(讲道理,这种方法真的稳了很多)。
- 如果你不信的话,你可以多试试,有一天你就会试出来的。你可以参考一下下面的链接,看看官方文档和别的开发者关于这方面是怎么说的。
- 参考链接1:关于 _ del _() 的官方文档。
- 参考链接2:stackoverflow关于_ del _() 的讨论。
补充
- 最好的使用方法是:定义一个start()方法用于连接操作,定义一个close()方法用于断开操作,在_ enter_()和_ exit_()中分别执行二者方法.如果你生性多疑的话,也可以定义_ del _()方法并在其中也执行 close()方法的,虽然这不是一个合适的选择。(如果有父类的话,记得super()一下哦)。
- del 关键字和__del__()是没有多大关系的。del xxx 不会主动调用__del__方法,只有引用计数 == 0时,_ del _()才会被执行,并且定义了__del__()的实例是不能解决循环引用等问题的(具体参考官方文档:“程序员的注意事项:”这一段),所以尽量别自定义__del__()。