这是我的参考代码:
class Manager(Employee):
def __init__(self, first, last, position, salary):
super().__init__(first, last, position)
self.salary = salary
def getinfo(self):
return self.first, self.last, self.position, self.salary
def give_raise(self, employee):
if type(employee) == type(Teller_1):
employee.hourly = int(employee.hourly * 1.10)
else:
employee.salary = int(employee.salary * 1.10)
def fire_employee(self, employee):
if type(employee.first) == type(Branch_manager) or type(employee) == type(Bank_executive):
print ("you cannot fire someone in an equal or higher position")
else:
print ("you have successfully fired " + str(employee.first) + " " + str(employee.last))
del employee
print (Analyst_1)
Analyst_1 = SalaryEmployee('Bob', 'Dun', 'Account Analyst', 40000)
当我输入以下代码时:
Branch_manager.fire_employee(Analyst_1)
我希望它删除对象“ Analyst_1”。但是,它所做的只是删除引用变量“ employee”而不是对象本身。
如何删除实际对象本身,而不仅仅是引用变量?
答案 0 :(得分:1)
您可以使用del
关键字或delattr
内置函数删除名称,但不能删除对象 。 (对象不会被删除,当不再有名称引用它们时,它们会收集垃圾。)
如果您的方法如下:
def fire_employee(employee):
...
你这样称呼
fire_employee(Analyst_1)
然后,名称Analyst_1
所引用的对象将与名称employee
所引用的对象相同。因此,即使您删除其中一个名称,只要另一个名称仍引用了该对象,对象本身仍将存在。
如果知道名称空间是什么以及名称是什么,则可以从全局名称空间中删除名称:
def fire_employee(employee_name):
module_object = sys.modules[__name__]
delattr(module_object, employee_name)
您应该这样称呼:
# Note that we pass a *string*, "Analyst_1", and not the *object*.
fire_employee('Analyst_1')
但是,如果您要走这条路线,最好将员工姓名到对象的映射保留在其自己的数据结构中,这可能是已经建议的dict
对象。