什么是自我变量=自我'意思是在python中

时间:2015-03-04 12:50:08

标签: python python-2.7

据我所知,在python' self'代表一个类的对象。最近我发现了一个代码,在构造函数(__init__)中,一个变量值被赋给了' self'如下所示:

self.x = self

任何人都可以解释实际分配给x的值是什么类型?

2 个答案:

答案 0 :(得分:2)

它创建一个循环引用。 self绑定到调用该方法的实例,因此设置self.x = self只会在实例上创建对实例的引用。

这是一件非常愚蠢的事情,可能对程序的内存性能有害。如果该类还定义了object.__del__() method,那么这将阻止对象被垃圾收集,导致所有CPython版本中的内存泄漏< 3.4(实现PEP 442):

>>> import gc
>>> class SelfReference(object):
...     def __init__(self):
...         self.x = self
...     def __del__(self):
...         pass
... 
>>> s = SelfReference()
>>> s.x is s   # the instance references itself
True
>>> del s      # deleting the only reference should clear it from memory
>>> gc.collect()
25
>>> gc.garbage # yet that instance is *still here*
[<__main__.SelfReference object at 0x102d0b890>]

gc.garbage列表包含垃圾回收器因循环引用和__del__方法无法清理的所有内容。

我怀疑您找到了极少数用于为self分配属性的实际用例之一,即usecase davidb mentions:设置self.__dict__self如果self是一个映射对象,用于合并&#39;属性和订阅访问一个命名空间。

答案 1 :(得分:1)

即使这种作业通常看起来不是一个好主意,但在某些情况下确实有用且优雅。 以下是其中一种情况:

class Dict(dict):
    '''Dictionary subclass allowing to access an item using its key as an
       attribute.
    '''
    def __init__(self, *args, **kwargs):
        super(Dict, self).__init__(*args, **kwargs)
        self.__dict__ = self

这是一个简单的用法示例:

>>> d = Dict({'one':1, 'two':2})
>>> d['one']
1
>>> d.one
1