rgo*_*kar 3 python destructor class
我正在尝试理解这段代码:
class Person:
'''Represents a person '''
population = 0
def __init__(self,name):
//some statements and population += 1
def __del__(self):
//some statements and population -= 1
def sayHi(self):
'''grettings from person'''
print 'Hi My name is %s' % self.name
def howMany(self):
'''Prints the current population'''
if Person.population == 1:
print 'i am the only one here'
else:
print 'There are still %d guyz left ' % Person.population
rohan = Person('Rohan')
rohan.sayHi()
rohan.howMany()
sanju = Person('Sanjivi')
sanju.howMany()
del rohan # am i doing this correctly?
Run Code Online (Sandbox Code Playgroud)
如何调用析构函数 - 自动或者我必须在上面的"main"程序/类中添加一些东西?
输出:
初始化人员数据
******************************************
初始化Rohan
******************************************
人口现在是:1
你好我的名字是Rohan
i我是这里唯一一个
初始化人员数据
******************************************
正在初始化Sanjivi
******************************************
人口现在是:2
In案件人死亡:
******************************************
Sanjivi再见世界
还有一个人离开
我是唯一的一个
人如果人死了:
******************************************
Rohan Bye Bye world
我是地球上的最后一个
人口现在是:0
如果需要,我也可以粘贴整个课程.我正在学习:http: //www.ibiblio.org/swaroopch/byteofpython/read/
Cha*_*iam 18
这是一个略微自以为是的答案.
不要用__del__.这不是C++或为析构函数构建的语言.该__del__方法确实应该在Python 3.x中消失,但我确信有人会找到一个有意义的用例.如果您需要使用__del __,请注意每个http://docs.python.org/reference/datamodel.html的基本限制:
__del__当垃圾收集器碰巧收集对象时调用,而不是在丢失对象的最后一个引用时而不是在执行时del object.__del__负责调用__del__超类中的任何一个,但不清楚这是在方法解析顺序(MRO)中还是仅调用每个超类.__del__垃圾收集器放弃检测和清除任何循环链接的手段,例如丢失对链表的最后引用.您可以获取忽略的对象列表gc.garbage.有时您可以使用弱引用来完全避免循环.这有时会受到争议:请参阅http://mail.python.org/pipermail/python-ideas/2009-October/006194.html.__del__函数可以作弊,保存对对象的引用,以及停止垃圾回收.__del__被忽略.__del__补充__new__远远超过__init__.这让人感到困惑.请参阅http://www.algorithm.co.il/blogs/index.php/programming/python/python-gotchas-1- del -is-not-the-opposite-of- init /获取解释和问题.__del__在Python中不是一个"深受喜爱"的孩子.您会注意到sys.exit()文档没有指定在退出之前是否收集垃圾,并且存在许多奇怪的问题.调用__del__on globals会导致奇怪的排序问题,例如http://bugs.python.org/issue5099.__del__即使__init__失败也应该打电话?有关长线程,请参阅http://mail.python.org/pipermail/python-dev/2000-March/thread.html#2423. 但另一方面:
__del__意味着你不要忘记致电一个密切的声明.有关专业观点,请参见http://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python/__del__.这通常是关于释放ctypes或其他一些特殊资源.而且我个人不喜欢这个__del__功能的原因.
__del__它时,它就会变成三十条混乱的信息.所以,找个不使用的理由__del__.
我从早期的 CPTS 经验中了解到:
构造函数:构造函数主要在类中使用,用值初始化类,并提供基于创建的一些后台工作的机会。如果您在创建对象期间传入值,则可以在此处处理将这些值分配给类中的变量的情况。(在这种情况下,在构建时您将增加一个跟踪人口的变量)。
析构函数:析构函数清理一个类。在Python中,由于垃圾收集器的原因,它不像可以留下悬挂指针的语言(C++)那么重要。(在这种情况下,您将在对象销毁时减少总体变量)。