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

时间:2010-03-12 13:53:06

标签: python class destructor

我正在尝试理解这段代码:

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/

2 个答案:

答案 0 :(得分:16)

这是一个有点自以为是的答案。

请勿使用__del__。这不是C ++或为析构函数构建的语言。 {3.}}方法确实应该在Python 3.x中消失,但我确信有人会找到一个有意义的用例。如果您需要使用__del__,请注意每个http://docs.python.org/reference/datamodel.html的基本限制:

但是,另一方面:

我个人不喜欢__del__功能的原因。

  • 每当有人提起__del__时,它就会变成三十条混乱信息。
  • 它打破了Python的禅宗中的这些项目:
    • 复杂比复杂更好。
    • 特殊情况不足以打破规则。
    • 错误永远不会无声地传递。
    • 面对歧义,拒绝猜测的诱惑。
    • 应该有一个 - 最好只有一个 - 显而易见的方法。
    • 如果实施难以解释,那就不错了。

因此,找个理由不使用__del__

答案 1 :(得分:1)

正如我从早期的CPTS经验中了解到的那样:

构造函数:构造函数主要用在类中,用值初始化类,并且有机会根据创建做一些后台工作。如果在创建对象期间传入值,则可以在此处处理这些值到类中变量的赋值。 (在这种情况下,在构建时,您正在递增一个跟踪人口的变量)。

析构函数:析构函数清理一个类。在python中,由于垃圾收集器,它不像可以留下悬挂指针的语言那样重要(c ++)。 (在这种情况下,您将在销毁对象时减少填充变量)。