我正在寻找一种方法来完成类创建,以便在python pre-3.3中重新创建__qualname__
。我的元类QualNameMeta
以递归方式设置__qualname__
并将其传播给成员。由于它的工作方式,我需要在类添加到模块时执行一个函数。
由于函数没有主动参与,我需要测试结果以标记无法访问的资质名称。
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
此测试可以在创建后轻松完成(不包括展开魔法):
def test_qualname(obj):
namespace = sys.modules[obj.__module__]
for name in obj.__qualname__.split('.'):
try:
namespace = getattr(namespace, name)
except AttributeError: # name does not point to any object
return False
return namespace is obj # make sure we got the right one
但是,我不能直接从元类中使用它。如果我在test_qualname
或QualMeta.__new__
中呼叫QualMeta.__init__
,则该对象的尚未绑定到模块。所以,在对象绑定到模块之后,我需要一种方法来执行检查。
为什么不装饰者? 我需要它继续使用继承,因此只能通过修改基类来修补整个类层次结构。使用元类是我到目前为止找到的唯一解决方案。
一个最小的虚拟例子:
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
答案 0 :(得分:0)
您需要在for f in *.txt; do
head -n 100 $f > small/$f
done
中设置新属性,并让class_dict
进行绑定:
type.__new__()