0

私はまだPythonの初心者で、現在、作成したい小さなモジュールにバージョン2.7を使用しています。

メニューを作成するためのものです(今のところ、かなり単純です)

ダニエルとデルナンの回答に基づく更新:

各メニューはオブジェクトです:

class UiNavMenu(object):

    def __init__(self):
       self.title = title
       self.links = []

    def add(self, title, link, **kwargs):
        '''
        Add a link to the menu by creating a UiNavLink object.
        '''
        link = UiNavLink(title, link, kwargs)
        self.links.append(link)

    def clear(self):
        '''
        Clear all links in the menu
        '''
        self.links = []

    def __repr__(self):
        return "<UInavmenu object> Menu '%s' : %s links" % (self.title, len(self.links))

これは実際にはかなり基本的なことです。

そして今、リンクオブジェクト:

class UiNavLink(object):

    def __init__(self, title, link, **kwargs):

        self.title = title
        self.link = link

        for key, value in kwargs.items():
            self.key = value

だから今、私が知りたかったことは:

まず、python がガベージ コレクターを使用し、オブジェクトが彼のプロセスの最後で破棄されることを知っています。

しかし、menu.clean() のようなメニュー オブジェクトの clean() メソッドを使用すると、メニューはすべてのコンテンツとともに破棄されます。したがって、その中のリスト (self.lists) も破棄されます。

しかし、リストに含まれるリンク オブジェクト (UiNavLink オブジェクト) も破棄されるので、気にする必要はありませんか? それとも手動で処理する必要がありますか?!

どうもありがとうございます :)

ヤン

4

1 に答える 1

0

Python (というか、デフォルトの CPython 実装) は参照カウントを使用します。別のオブジェクトへの参照を含むオブジェクト、またはそれ自体がオブジェクトへの参照を持つリストを含むオブジェクトが削除されるかスコープ外になると、そのオブジェクトの参照カウントが減少します。オブジェクトの参照カウントが 0 になると、ガベージ コレクションが実行されます。したがって、リストがそれらのオブジェクトへの唯一の参照である場合、所有者が削除されると削除されますが、他の変数も参照を保持している場合は削除されません。

ただし、いくつかのポイント。まず、これについて心配することはめったにありません。Python のメモリ管理は自動化されており、メモリ リークの発生は非常に困難です (不可能ではありませんが)。

第二に、デルナンがコメントで指摘しているように、それ__del__は間違いなく正しい方法ではありません。__del__は Python によって自動的に呼び出されます (ただし、1 回だけ呼び出されるか、まったく呼び出されるとは限りません)。これを定義したという事実そのものが、未定義のままにしておく場合よりもメモリ リークにつながる可能性が高くなります。

于 2013-09-21T12:31:27.770 に答える