Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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_Python 3.x_Python 2.x - Fatal编程技术网

Python 在类绑定到模块名称空间后完成该类

Python 在类绑定到模块名称空间后完成该类,python,python-3.x,python-2.x,Python,Python 3.x,Python 2.x,我正在寻找一种完成类创建的方法,以便在python pre-3.3中重新创建\uuuuu qualname\uuuu。我的元类QualNameMeta递归地设置\uuuu qualname\uuu,并将其传播给成员。由于这种工作方式,我需要在将类添加到模块时执行一个函数 由于函数不主动参与,我需要测试结果以标记不可访问的qualnames class Scope1(object): __metaclass__ = QualNameMeta def scope_f(self):

我正在寻找一种完成类创建的方法,以便在python pre-3.3中重新创建
\uuuuu qualname\uuuu
。我的元类
QualNameMeta
递归地设置
\uuuu qualname\uuu
,并将其传播给成员。由于这种工作方式,我需要在将类添加到模块时执行一个函数

由于函数不主动参与,我需要测试结果以标记不可访问的qualnames

class Scope1(object):
    __metaclass__ = QualNameMeta
    def scope_f(self):
        class ScopeF(object):
            __metaclass__ = QualNameMeta
        return ScopeF
    print scope_f.__qualname__ # gives correct Scope1.scope_f
    print scope_f().__qualname__ # gives ScopeF, should be None or Scope1.scope_f.<locals>.ScopeF
然而,我不能直接从元类中得到它。如果我在
QualMeta.\uuuu new\uuuu
QualMeta.\uuuu init\uuuu
中调用
test\u qualname
,则对象尚未绑定到模块。因此,我需要一种在对象绑定到模块后执行检查的方法

为什么不是装饰师? 我需要它来持久地处理继承,这样就可以只通过修改基类来修补整个类层次结构。到目前为止,使用元类是我找到的唯一解决方案


一个最小的虚拟示例:

class QualMeta(type):
    def __new__(mcs, name, bases, class_dict):
        new_cls = type.__new__(mcs, name, bases, class_dict)
        new_cls.__qualname__ = name  # dummy for top-level only
        if not test_qualname(new_cls):  # new_cls is not bound yet, test will fail
            new_cls.__qualname__ = None
        return new_cls


class Qualnamed(object):
    __metaclass__ = QualMeta

print(Qualnamed.__qualname__)  # gives None

您需要在
class\u dict
中设置新属性,并让
键入。\uuu new\uuu()
执行绑定:

class QualMeta(type):
    def __new__(mcs, name, bases, class_dict):
        class_dict['__qualname__'] = name
        new_cls = type.__new__(mcs, name, bases, class_dict)
        return new_cls

class Qualnamed(object):
    __metaclass__ = QualMeta

print(Qualnamed.__qualname__)  # print "Qualnamed"

问题不是将
\uuuu qualname\uuuu
绑定到
新的\u cls
,否则会出现属性错误。问题是,
new\u cls
此时未绑定到其模块。因此,
new\u cls.\uuuuuu qualname\uuuu
已定义且有效,但其模块中的查找失败。抱歉,请将问题读至fast。由于元类基本上创建了该类,因此您在
模块
全局
中看不到
QualMeta
是正常的,因为它还不存在。
class QualMeta(type):
    def __new__(mcs, name, bases, class_dict):
        class_dict['__qualname__'] = name
        new_cls = type.__new__(mcs, name, bases, class_dict)
        return new_cls

class Qualnamed(object):
    __metaclass__ = QualMeta

print(Qualnamed.__qualname__)  # print "Qualnamed"