我正在尝试理解这段代码:
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?
如何自动调用析构函数 - 或者我是否必须在上面的“main”程序/类中添加一些内容?
输出:
初始化人员数据
******************************************
初始化Rohan
******************************************
人口现在是:1
嗨,我的名字是Rohan
我是这里唯一的一个 初始化人员数据
******************************************
初始化Sanjivi
******************************************
人口现在是:2
万一人死亡:
******************************************
Sanjivi Bye Bye世界
还有1人离开了 我是这里唯一的一个 万一人死亡:
******************************************
Rohan Bye Bye世界
我是世界上最后一个人 人口现在是:0
如果需要,我也可以粘贴整个课程。我正在学习: http://www.ibiblio.org/swaroopch/byteofpython/read/
答案 0 :(得分:16)
这是一个有点自以为是的答案。
请勿使用__del__
。这不是C ++或为析构函数构建的语言。 {3.}}方法确实应该在Python 3.x中消失,但我确信有人会找到一个有意义的用例。如果您需要使用__del__
,请注意每个http://docs.python.org/reference/datamodel.html的基本限制:
__del __
被调用,而不是在您丢失对对象的最后一个引用而不是在执行__del__
时。del object
负责调用超类中的任何__del__
,但事实并非如此
如果这是在方法解析顺序(MRO)或只是调用每个超类。__del__
意味着垃圾收集器放弃检测和清除任何循环链接,例如丢失对链表的最后一个引用。您可以从__del__
获取忽略的对象列表。有时您可以使用弱引用来完全避免循环。这有时会引起争议:见http://mail.python.org/pipermail/python-ideas/2009-October/006194.html。gc.garbage
函数可以作弊,保存对象的引用,并停止垃圾回收。__del__
中明确提出的例外情况。__del__
补充__del__
远远超过__new__
。这让人感到困惑。有关解释和问题,请参阅http://www.algorithm.co.il/blogs/index.php/programming/python/python-gotchas-1-del-is-not-the-opposite-of-init/。__init__
不是Python中“深受喜爱”的孩子。您会注意到sys.exit()文档没有指定在退出之前是否收集垃圾,并且存在许多奇怪的问题。在全局变量上调用__del__
会导致奇怪的排序问题,例如http://bugs.python.org/issue5099。即使__del__
失败,__del__
是否应该调用?有关长线程,请参阅http://mail.python.org/pipermail/python-dev/2000-March/thread.html#2423。 但是,另一方面:
__init__
表示你不要忘记致电一个密切的陈述。有关专家__del__
观点,请参阅http://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python/。这通常是关于释放ctypes或其他一些特殊资源。我个人不喜欢__del__
功能的原因。
__del__
时,它就会变成三十条混乱信息。因此,找个理由不使用__del__
。
答案 1 :(得分:1)
正如我从早期的CPTS经验中了解到的那样:
构造函数:构造函数主要用在类中,用值初始化类,并且有机会根据创建做一些后台工作。如果在创建对象期间传入值,则可以在此处处理这些值到类中变量的赋值。 (在这种情况下,在构建时,您正在递增一个跟踪人口的变量)。
析构函数:析构函数清理一个类。在python中,由于垃圾收集器,它不像可以留下悬挂指针的语言那样重要(c ++)。 (在这种情况下,您将在销毁对象时减少填充变量)。