Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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 理解引用计数和元类_Python_Reference_Python 2.x - Fatal编程技术网

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

我试图用元类做一些事情,但我不理解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, **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的引用。