Python在运行时删除类对象

时间:2019-03-15 14:08:33

标签: python function class

这是我的参考代码:

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”而不是对象本身。

如何删除实际对象本身,而不仅仅是引用变量?

1 个答案:

答案 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对象。