python - 为什么全局变量 __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 案例,为什么?
解决方案
如果您使用的是 Python 2,那么您的问题是您列为object
的基类C1
,并且全局__metaclass__
回退的优先级低于基类的元类。
如果您使用的是 Python 3,那么您的问题是 global__metaclass__
不再执行任何操作。
推荐阅读
- python - 如何将随机二进制信息添加到当前的“坐标”中?(Python)
- mysql - 如何获取MySQL表中列值相同的所有行?
- html - google fonts - 字体系列在页面后加载,如何解决?
- c++ - 指向具有指针成员的对象的指针数组的析构函数
- python - 模型并行不适用于增加 tensorflow1.12 中的模型大小?
- spring-boot - 运行 Azure DevOps Pipeline 时如何跳过构建测试(Spring Boot Maven 项目)
- python - 如何使用标签将 txt 文件数据集分类为两个数据集?
- networking - 为数据包处理添加延迟 (omnet++)
- google-sso - 带有 Itop 的 Google Workspace SSO
- firebase - 有没有办法仅将 BigQuery 镜像 Firebase Firestore 用于 CREATE 和 DELETE?