Python, удаляющий объект класса во время выполнения - PullRequest
0 голосов
/ 15 марта 2019

Это мой код для справки:

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 Ответ

1 голос
/ 15 марта 2019

Вы можете удалить имя , используя ключевое слово 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, как уже предлагалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...