使用类方法删除全局参数中的对象



我正在尝试构建一个类方法,在该方法中,我可以从系统内存中删除类对象的实例。组合运算符赋值给了我所需的输出,但我仍然无法从globals((或dir((中删除类对象bananna的实例。我做错了什么?

代码:

class Budget:
def __init__(self,category):
self.category=category
self.amount=0

def total():
pass
def percentage_breakdown():
pass
def category_percentage_breakdown():
pass
class Food:
def __init__(self,name, amount):
self.name=name
self.amount=amount
def add_to_budget(self,Budget):
if Budget.category=='Food':
Budget.amount+=self.amount
else:
print(' I know you want to cheat your budget but thats not going to happen')
def remove_from_budget(self,Budget):
if Budget.category=='Food':
Budget.amount-=self.amount
for name in dir():
if name==self:
del globals()[self]
else:
print('You are not gonna feel any less guilty about starving yourself')

food=Budget('Food')
bananna= Food('bananna',3)
print(bananna)
bananna.add_to_budget(food)
print(food.amount)
bananna.remove_from_budget(food)
print(food.amount)
print(globals())
print(dir()) 

输出:

>>> bananna= Food('bananna',3)
>>> print(bananna)
<__main__.Food object at 0x000001E361E1EEB0>
>>> bananna.add_to_budget(food)
>>> print(food.amount)
3
>>> bananna.remove_from_budget(food)
>>> print(food.amount)
0
>>> print(globals())
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'Budget': <class '__main__.Budget'>, 'Food': <class '__main__.Food'>, 'food': <__main__.Budget object at 0x000001E361E1EE80>, 'bananna': <__main__.Food object at 0x000001E361E1EEB0>, 'entertainment': <__main__.Budget object at 0x000001E361E1EDF0>}
>>> print(dir())
['Budget', 'Food', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'bananna', 'entertainment', 'food'] 
del语句删除名称,而不是对象。del命令可能会对对象进行垃圾收集,但前提是删除的变量包含对该对象的最后一个引用,或者该对象变得不可访问。

这就是为什么您的对象没有删除,因为仍然存在引用,并且CPython不会删除该对象,直到不再引用该对象为止
正确的方法就像Peter在评论中所说的那样

最新更新