首页 > 解决方案 > 为什么全局变量 __metaclass__ 不起作用?

问题描述

我在这里定义了一些函数,它将所有用户定义的属性更改为大写

def up(name, parent, attr):
    user_defined_attr = ((k, v) for k, v in attr.items() if not k.startswith('_'))
    up_attr = {k.upper(): v for k,v in user_defined_attr}
    return type(name, parent, up_attr)

例如:

my_class = up('my_class', (object,), {'some_attr': 'some_value'})

hasattr(my_class, 'SOME_ATTR')
True

这是python doc关于元类的一些话

https://docs.python.org/2/reference/datamodel.html?highlight=元类#元类

The appropriate metaclass is determined by the following precedence rules:

If dict['__metaclass__'] exists, it is used.
Otherwise, if there is at least one base class, its metaclass is used (this looks for a __class__ attribute first and if not found, uses its type).
Otherwise, if a global variable named __metaclass__ exists, it is used.
Otherwise, the old-style, classic metaclass (types.ClassType) is used.

所以我做了一些测试

>>> def up(name, parent, attr):
...     user_defined_attr = ((k, v) for k, v in attr.items() if not k.startswith('_'))
...     up_attr = {k.upper(): v for k,v in user_defined_attr}
...     return type(name, parent, up_attr)
... 
>>> 
>>> 
>>> __metaclass__ = up
>>> 
>>> class C1(object):
...     attr1 = 1
... 
>>> hasattr(C1, 'ATTR1')
False

不适用于全局 var 案例,为什么?

标签: pythonpython-2.7metaclass

解决方案


如果您使用的是 Python 2,那么您的问题是您列为object的基类C1,并且全局__metaclass__回退的优先级低于基类的元类。

如果您使用的是 Python 3,那么您的问题是 global__metaclass__不再执行任何操作。


推荐阅读