Есть ли потенциальные проблемы с установкой super () для атрибута класса? - PullRequest
0 голосов
/ 01 октября 2018

Я немного изменил способ использования super, так как я немного лучше с ним ознакомился, и каждый раз я обнаруживал проблему.Мне все еще приходится использовать Python 2.7, поэтому необходим старый синтаксис.

Два альтернативных способа, которые я пробовал и прекратил использовать, это super(self.__class__, self) и InheritClass.func(self, ...).

Iпонял, что super в основном возвращает объект, поэтому вместо постоянного создания объекта его можно было бы присвоить атрибуту класса.Это выглядит немного лучше, поскольку экземпляр нужно прочитать только один раз, но могут ли возникнуть какие-либо потенциальные проблемы, связанные с этим.

Я установил его на self.__super, так что ничто не может реально помешать емуЯ просто хотел бы получить мнение, прежде чем я сделаю слишком много, и мне придется переписать весь код.

1 Ответ

0 голосов
/ 01 октября 2018

Проблема с назначением объекта super атрибуту экземпляра состоит в том, что он создает ссылочный цикл:

import weakref

class RefCycle(object):
    def __init__(self):
        self.__super = super(RefCycle, self)

obj = RefCycle()

ref = weakref.ref(obj)
del obj
assert ref() is None  # <- assertion fails, the object still exists

Конечно, сборщик мусора обнаружит и очистит этот ссылочный цикл в конце концов, но если вы привыкнете использовать super, как это, вы будете тратить значительное количество памяти.

Лучшее решение - реализовать property, который возвращает super объект:

class NoRefCycle(object):
    @property
    def __super(self):
        return super(NoRefCycle, self)

Таким образом, не создаются ссылочные циклы.

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