Python 从元类访问基类变量

Python 从元类访问基类变量,python,python-3.x,metaprogramming,Python,Python 3.x,Metaprogramming,我正在尝试使用以下代码从元类读取基类变量以覆盖类变量: class TypeBaseMeta(type): def __new__(cls, name, bases, namespace, **kwds): for base in bases: namespace['__validators__'] = base['__validators__'] + namespace['__validators__'] return type

我正在尝试使用以下代码从元类读取基类变量以覆盖类变量:

class TypeBaseMeta(type):
    def __new__(cls, name, bases, namespace, **kwds):
        for base in bases:
            namespace['__validators__'] = base['__validators__'] + namespace['__validators__']

        return type.__new__(cls, name, bases, namespace, **kwds)

class TypeBase(metaclass=TypeBaseMeta):
    __validators__ = ('presence')

    def __init__(self, *args, **kwargs):
        pass

    def validate_presence(self, flag):
        if self.data:
            return True

class String(TypeBase):
    __validators__ = ('length')

    def validate_length(self, range):
        if len(self.data) in range(*range):
            return True
但我有一个错误:

Traceback (most recent call last):
  File "types.py", line 18, in <module>
    class String(TypeBase):
  File "types.py", line 4, in __new__
    namespace['__validators__'] = base['__validators__'] + namespace['__validators__']
TypeError: 'TypeBaseMeta' object is not subscriptable
回溯(最近一次呼叫最后一次):
文件“types.py”,第18行,在
类字符串(TypeBase):
文件“types.py”,第4行,新__
名称空间[''''''.'验证器]=base['''.'验证器]+名称空间[''.'验证器]]
TypeError:“TypeBaseMeta”对象不可下标


我知道可订阅对象必须具有
\uuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
,并且其行为类似于字典和列表,但我不知道是什么导致了这个错误。

\uuuuuuuuuuuuuuu。(也就是说,将
base['''''''''''''''.\code>更改为
base.\u'.\u'.\u'.\u'.\u'.\u'.
。不要更改
命名空间['''.\u'.\u'.\u'.\u'.\u'.

使用
名称空间[''\uu验证程序]
访问当前类的属性的原因是该类尚不存在(它是由元类创建的)。现在你所拥有的只是它的属性。但是超类(
base
)已经创建,并且是一个真正的类,其属性通过
以正常方式访问


正如Dunes在评论中指出的,您的代码还有另一个问题,那就是您应该为验证器编写
('presence',)
('length',)
,以创建元组。否则,它们只是字符串,子类的
\uuuuuuuuuuuu验证程序
将设置为单个字符串
'presencelength'
超类中的
\uuuuuuuuuu验证程序\uuuuuuuuuuuuu
变量不能像字典一样访问-您必须从它的
\uuuuu dict\uuuu
属性中获取它,或者使用
getattr

- namespace['__validators__'] = base['__validators__'] + namespace['__validators__']
+  namespace['__validators__'] = base.__dict__.get('__validators__', ()) + namespace['__validators__']

当我将
名称空间[''''''''''''''''''''''''''.'验证程序]
更改为
base时,我得到了
KeyError:'''''''.'''''.'''.''''.'''.''''.'''.'''.'''.''''.'''.''.'''.''.'.''''''.'.'''''.'.''''.'验证程序'。更改
base[''验证程序]
。(我在回答中补充了一个澄清。)很抱歉误解。我犯了一个错误。我更改了
base[''验证器]
,但仍然得到相同的错误。整行:
namespace['''''''''''''''''''''''.''.'''.''.''.'验证程序'.''.'验证程序'.'''.'名称空间['''.'''.'''.'''.'''.''''.'验证程序'.'验证程序]
@RalphGutkowski:我不能复制这个。当我使用建议的更改运行代码时,它不会出错。看,我的错。在我的文件末尾,我得到了一个从TypeBase扩展而来的类,该类没有
\uuuu验证程序\uuuu
变量。谢谢你的帮助。我会给你另一个+1的完美解释你写的!验证器是字符串,而不是字符串的元组。单个元素元组被指定为
(项,)