【发布时间】:2019-09-27 03:43:01
【问题描述】:
我在这里定义了一些函数,它将所有用户定义的属性都变成大写
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=metaclass#metaclass
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 案例,为什么?
【问题讨论】:
-
那是 Python 2 文档。你在 Python 2吗? Python 3 改变了一切。
-
另外,你列出了一个基类,所以无论如何你都不会碰到全局变量。
标签: python python-2.7 metaclass