earth
是一个代表某些国家/地区的课程。当我实例化某个国家/地区时,total_population
会增加1
个人,该国家/地区的人口将从1
开始。我们可以使用1
或burn()
方法将\ sub die()
添加到\ total-poulation和country-population中。
>>> class earth:
population=0
def __init__(self):
self.population=1
earth.population+=1
print("Total:"+str(earth.population),"This Country:"+str(self.population))
def __del__(self):
earth.population -= self.population
self.population = 1
print("Total:"+str(earth.population),"This Country:"+str(self.population))
def burn(self):
self.population+=1
earth.population+=1
print("Total:"+str(earth.population),"This Country:"+str(self.population))
def die(self):
self.population-=1
print("Total:"+str(earth.population),"This Country:"+str(self.population))
earth.population+=1
>>> Amerca=earth()
('Total:1', 'This Country:1')
>>> Amerca=earth()
('Total:2', 'This Country:1')
('Total:1', 'This Country:1')
问题:
为什么当我使用之前使用的名称实例化类时,我有两行输出? __init__
和__del__
都运行了吗?我怎么能在另一场比赛之前完成一场比赛?我的意思是哪一个先于另一个运行?我可以改变序列吗?
正如我所看到的,在这种情况下,当我实例化我之前使用的名称时,首先运行__init__
然后运行__del__
!对?如果是这样,为什么?
答案 0 :(得分:1)
是的,正在调用第二个实例的第一个__init__
来创建它。然后,因为第一个实例不再被任何变量引用,它将被删除。它被删除是因为在指向它的最后一个变量被反弹到别的东西之后再也无法到达它,因此可以安全地删除它。
你真的不清楚你想要实现什么,为什么你这么奇怪地做到这一点,但是你可以影响他们这样运行的顺序:
x = earth()
('Total:1', 'This Country:1') # __init__ called
x = None
('Total:0', 'This Country:1') # __del__ called as first instance is no longer used
x = earth()
('Total:1', 'This Country:1') # __init__ called again for the second instance
当实例即将被销毁时调用。这也称为析构函数。如果基类具有 del ()方法,则派生类的 del ()方法(如果有)必须显式调用它以确保正确删除基类的部分实例。请注意, del ()方法可以(尽管不推荐!)通过创建对它的新引用来推迟实例的销毁。然后可以在稍后删除该新引用时调用它。无法保证为解释器退出时仍然存在的对象调用 del ()方法。
答案 1 :(得分:0)
正如assignment statements中所述,a = b
表示"评估b",在这种情况下调用 init ,然后"绑定结果是' a'"。第二步必然解开' a'从其他任何东西。如果在这种情况下,' a'是对前一个对象的唯一引用,然后调用__del__
(如果存在)。
其他一些说明:'实例化'拼写是这样的。在__del__
中,self.population应该变为0,而不是1,或者可能不会被修改或打印。由于燃烧可以杀死,烧伤'似乎是一个错误的出生'。在die
中,总人口应该减少,而不是增加,然后再打印。