我试图理解这段代码:
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”程序/类中添加类似的内容?
输出:
Initializing person data
******************************************
Initializing Rohan
******************************************
Population now is: 1
Hi My name is Rohan
i am the only one here
Initializing person data
******************************************
Initializing Sanjivi
******************************************
Population now is: 2
In case Person dies:
******************************************
Sanjivi Bye Bye world
there are still 1 people left
i am the only one here
In case Person dies:
******************************************
Rohan Bye Bye world
i am the last person on earth
Population now is: 0
如果需要的话,我也可以把整个课程都贴上。我正在学习: http://www.ibiblio.org/swaroopch/byteofpython/read/
正如我从早期的CPT经验中了解到的:
构造函数:构造函数主要用于类中,用值初始化类,并在创建的基础上提供一个做一些后台工作的机会。如果在创建对象期间传入值,则可以在此处处理将这些值分配给类内变量的操作。(在本例中,在构造时,您将递增一个跟踪总体的变量)。
析构函数:析构函数清理类。在python中,由于垃圾收集器的存在,它不像那些可以留下挂起指针的语言(c++)那么重要。(在本例中,您是在销毁对象时递减population变量)。
这是一个有点自以为是的答案。
不要使用
__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__
会导致奇怪的排序问题,例如http://bugs.python.org/issue5099。即使__init__
失败,也应该调用__del__
?有关长线程,请参见http://mail.python.org/pipermail/python-dev/2000-March/thread.html#2423。但另一方面:
__del__
表示不要忘记调用close语句。有关pro__del__
视图,请参见http://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python/。这通常是为了释放ctypes或其他一些特殊资源。以及我不喜欢
__del__
函数的个人原因。__del__
时,它就演变成三十条混乱的信息。所以,找到一个不使用
__del__
的理由。相关问题 更多 >
编程相关推荐