Удалить все переменные (классы), сгенерированные методом класса python - PullRequest
5 голосов
/ 24 сентября 2019

По какой-то причине мне нужно иметь возможность удалить всех детей (в некотором смысле), которые были созданы каким-либо методом класса.Вот пример:

class A():
    def __init__(self):
        self.a_val = 56
        self.children = list()

    def __del__(self):
        del self.children

    def gen_b(self):
        return B(self.a_val)

class B():
    def __init__(self, val):
        self.a_val = val
        self.b_val = 87

Я хочу как-то добавить сгенерированный класс B из gen_b в A().children так, чтобы:

a_class = A()
b_generated = a_class.gen_b()
del a_class
# b_generated is also deleted

Кроме того, мне это нужно дляcython (я использую классы cdef), так что, возможно, есть некоторые решения с __dealloc__ или другие специфичные для Cython нотации.Все решения будут оценены.

1 Ответ

4 голосов
/ 24 сентября 2019

Мне нужно как-то добавить сгенерированный класс B из gen_b в A (). Children

Просто сохраните новый элемент, прежде чем возвращать его, и вы можете делать с ним все, что захотите- включая добавление к детям

    def gen_b(self):
        b = B(self.a_val)
        self.children.append(b)
        return b

Что касается del ... Пожалуйста, прочитайте, что на самом деле делает .Самая важная часть:

Удаление имени удаляет привязку этого имени

Так что если вы, например,

>>> a_class = A()
>>> a2 = a_class
>>> del a_class

a2 все ещебудет работать и предназначаться для того же элемента (потому что он содержит ту же ссылку, что и a_class).del просто удаляет имя, а не сам объект.

Вам потребуется другой подход для удаления этих элементов.

...