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使用垃圾收集器,并且在他的进程中销毁了一个对象。

但是,如果我使用菜单对象的 clean() 方法,例如:menu.clean(),菜单将与他的所有内容一起被销毁。因此其中的列表(self.lists)也将被销毁。

但是列表中包含的链接对象(UiNavLink 对象)是否也会被破坏,所以我不必照顾它?还是我必须手动处理它?!

非常感谢你 :)

4

1 回答 1

0

Python(或者更确切地说,默认的 CPython 实现)使用引用计数。当包含对另一个对象的引用的对象 - 或包含本身具有对对象的引用的列表 - 被删除或超出范围时,该对象的引用计数会减少。当一个对象的引用计数为 0 时,它就会被垃圾回收。因此,如果您的列表是对这些对象的唯一引用,那么当它们的持有者存在时,它们将被删除 - 但如果其他变量也持有引用,它们将不会被删除。

不过有几点。首先,您应该很少担心这一点。Python 内存管理是自动的,而且内存泄漏很难实现(尽管并非不可能)。

其次,正如 delnan 在评论中指出的那样,这__del__绝对不是正确的做法。__del__由 Python 自动调用(尽管不能保证只调用一次,或者根本不调用),而且您定义它的事实比您刚刚未定义它可能导致内存泄漏。

于 2013-09-21T12:31:27.770 回答