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

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__它时,它就会变成三十条混乱的信息.
  • 它打破了Python的禅宗中的这些项目:
    • 复杂比复杂更好.
    • 特殊情况不足以打破规则.
    • 错误不应该默默地传递.
    • 面对模棱两可,拒绝猜测的诱惑.
    • 应该有一个 - 最好只有一个 - 明显的方法来做到这一点.
    • 如果实施很难解释,这是一个坏主意.

所以,找个不使用的理由__del__.

  • 令人敬畏的查尔斯 - 虽然它更具技术性,但我现在理解得更好 - 最后一个问题 - 当我创造一个物体时 - 它真的会被毁灭/自由吗?就像你说不使用__del__那样只是做一些微小的功能并让它按照我想要的输出工作更好吗?再次感谢提前 (2认同)

Hor*_*ein 1

我从早期的 CPTS 经验中了解到:

构造函数:构造函数主要在类中使用,用值初始化类,并提供基于创建的一些后台工作的机会。如果您在创建对象期间传入值,则可以在此处处理将这些值分配给类中的变量的情况。(在这种情况下,在构建时您将增加一个跟踪人口的变量)。

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

  • 不,“del rohan”不会调用析构函数。它将减少“rohan”对象的引用计数,并从该范围中删除该名称。*如果*引用计数达到0*则*析构函数将被调用。这是一个微妙但重要的区别。 (5认同)