Python 理解引用计数和元类
我试图用元类做一些事情,但我不理解python代码的结果Python 理解引用计数和元类,python,reference,python-2.x,Python,Reference,Python 2.x,我试图用元类做一些事情,但我不理解python代码的结果 import sys class Meta(type): a = None b = None def __call__(cls, *args, **kwargs): name = args[0] if getattr(cls, name) is None: setattr(cls, name, super(Meta, cls).__call__(*args
import sys
class Meta(type):
a = None
b = None
def __call__(cls, *args, **kwargs):
name = args[0]
if getattr(cls, name) is None:
setattr(cls, name, super(Meta, cls).__call__(*args, **kwargs))
return getattr(cls, name)
class A:
__metaclass__ = Meta
def __init__(self, name, in_a = None):
self.a = None
if in_a:
self.a = in_a
a = A("a")
print sys.getrefcount(a) - 2 # 1
b = A("b", a)
print sys.getrefcount(a) - 2 # 2
b = None
print sys.getrefcount(a) - 2 # 2?
我有两个关于a的引用,其中一个是b的属性
当我删除引用b或设置为“无”时,a上的引用计数仍然为2
现在,当我不使用元类时,它工作得很好:
class A:
def __init__(self, in_a = None):
self.a = None
if in_a is not None:
self.a = in_a
a = A()
print sys.getrefcount(a) - 1 # 1
b = A(a)
print sys.getrefcount(a) - 1 # 2
b = None
print sys.getrefcount(a) - 1 # 1
您能解释一下区别吗?在您的代码中,b也存储为A.b,因此仅将全局b设置为“无”不会触发此实例的集合-因为仍有一个引用-因此refcount保持常量。瞧,你忘了检查b上的参考计数;-
只需添加A.b=None,您将看到refcount下降
请注意,它与元类无关,不确定您在这里实际要做什么,但可能有一个更简单/明显的解决方案 为什么要用元类减去2,而不用元类只减去1?因为我在类中存储了一个额外的引用:setattrcls、name、superMeta、cls.\uuuuu调用\uuuu*args、**kwargs,该引用使原始b保持活动状态,但它仍然有一个对a的引用。