Python 在类绑定到模块名称空间后完成该类
我正在寻找一种完成类创建的方法,以便在python pre-3.3中重新创建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):
\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"