代码之家  ›  专栏  ›  技术社区  ›  max

python:元类中新的时间点

  •  4
  • max  · 技术社区  · 14 年前

    下面的代码不能编译;它说

    名称错误:名称“字段”不是 定义

    在最后一行。是因为吗? __new__ 直到 fields 是否已完成分配?我该怎么办?

    class Meta(type):
        def __new__(mcs, name, bases, attr):
            attr['fields'] = {}
            return type.__new__(mcs, name, bases, attr)
    
    class A(metaclass = Meta):
        def __init__(self, name):
            pass
    
    class B(A):
        fields['key'] = 'value'
    

    编辑:

    我发现这不是时间问题,而是名字隐藏问题。如果我写的话就可以了 A.fields 相反。

    我想知道为什么我不能用 领域 super().fields .

    1 回复  |  直到 14 年前
        1
  •  4
  •   aaronasterling    14 年前

    fields['key'] = 'value'

    class foo(object):
        var1 = 'bar'
    
        def foobar(self):
            pass
    

    class

    1. var1 = 'bar' locals()['var1'] = 'bar'

    2. def foobar locals()['var'] = the result of compiling the function

    3. locals() __new__ type

    4. foo

    A.fields A Meta fields

    super().fields B super(B).fields

    def MakeFields(**fields):
        return fields
    
    class Meta(type):
        def __new__(mcs, name, bases, attr):
            for base in bases:
                if hasattr(base, 'fields'):
                    inherited = getattr(base, 'fields')
                    try:
                        attr['fields'].update(inherited)
                    except KeyError:
                        attr['fields'] = inherited
                    except ValueError:
                        pass
            return type.__new__(mcs, name, bases, attr)
    
    class A(metaclass=Meta):
        fields = MakeFields(id='int',name='varchar') 
    
    class B(A):
        fields = MakeFields(count='int')
    
    class C(B):
        pass
    
    class Test(object):
        fields = "asd"
    
    class D(C, Test):
        pass
    
    print C.fields
    print D.fields