构造函数和析构函数是如何工作的?

2024-10-03 21:29:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解这段代码:

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/


Tags: thenameselfisdefampersonbye
2条回答

正如我从早期的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__函数的个人原因。

  • 每当有人提起__del__时,它就演变成三十条混乱的信息。
  • 它打破了Python禅中的这些项目:
    • 复杂胜于复杂。
    • 特殊情况不足以打破规则。
    • 错误不应该悄无声息地过去。
    • 面对模棱两可,拒绝猜测的诱惑。
    • 应该有一个——最好只有一个——显而易见的方法。
    • 如果实现很难解释,那是个坏主意。

所以,找到一个不使用__del__的理由。

相关问题 更多 >