Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Destructing类还可以销毁其中使用的另一个类吗?_Python_Django_List_Object_Destroy - Fatal编程技术网

Python Destructing类还可以销毁其中使用的另一个类吗?

Python Destructing类还可以销毁其中使用的另一个类吗?,python,django,list,object,destroy,Python,Django,List,Object,Destroy,我仍然是python的初学者,目前正在使用版本为2.7的小模块 它用于创建菜单(目前非常简单) 根据Daniel和delnan的答案更新: 每个菜单都是一个对象: class UiNavMenu(object): def __init__(self): self.title = title self.links = [] def add(self, title, link, **kwargs): ''' Add a

我仍然是python的初学者,目前正在使用版本为2.7的小模块

它用于创建菜单(目前非常简单)

根据Daniel和delnan的答案更新:

每个菜单都是一个对象:

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))
现在,我想知道的是:

首先,我知道python使用垃圾收集器,并且在进程的和处销毁一个对象

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

但是列表中包含的links对象(UiNavLink对象)是否也会被销毁,这样我就不必处理它了? 还是我必须手动处理

非常感谢:)

Yann

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

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


其次,正如德尔南在评论中指出的那样,
\uu del\uu
绝对不是正确的方式<代码>\uuuu del\uuuu由Python自动调用(尽管不能保证只调用一次,或者根本不调用),而且您已经定义了它这一事实比您刚刚未定义它更可能导致内存泄漏

我不确定您想做什么,但是
\uu del\uu
几乎肯定是实现它的一个错误选择。它是不可靠的(在3.4之前非常不可靠,在3.4之后更是如此),在意外的时间运行,并且它与对象生存期有关,这几乎肯定不是您想要将任何东西耦合到的时间跨度,因为它可以,有时会无限期地延长。@delnan;3.4是怎么回事?@Veedrac谢谢你的回答。我将更新第一篇帖子,以反映我根据您和delnan的答案所做的新更改!
class UiNavLink(object):

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

        self.title = title
        self.link = link

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