据我所知,在python' self'代表一个类的对象。最近我发现了一个代码,在构造函数(__init__
)中,一个变量值被赋给了' self'如下所示:
self.x = self
任何人都可以解释实际分配给x的值是什么类型?
答案 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