Python 为什么全局变量元类不工作?

Python 为什么全局变量元类不工作?,python,python-2.7,metaclass,Python,Python 2.7,Metaclass,我在这里定义了一些func,它将把所有用户定义的属性都改为大写 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_cl

我在这里定义了一些func,它将把所有用户定义的属性都改为大写

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文档中关于元类的一些词

所以我做了一些测试

>>> 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

不适用于全局变量情况,为什么?

如果您使用的是Python 2,您的问题是将对象列为C1的基类,全局元类回退的优先级低于基类的元类


如果您使用的是Python 3,那么您的问题是全局元类不再做任何事情。

似乎只有旧式类使用全局元类变量。事实上,它们是老式的与此无关,但这是它们被定义的方式。新样式类显式继承自具有元类的类,而旧样式类则不继承

class Meta(type):
    pass


__metaclass__ = Meta


class NewStyle(object):
    pass

class OldStyle:
    pass


print "new style", type(NewStyle)
print "old style", type(OldStyle)
此代码打印:

new style <type 'type'>
old style <class '__main__.Meta'>

这似乎与您列出的规则一致。NewStyle有基类对象,该类有自己的元类类型。因此,对于新样式的类,类型是根据秒规则选择的。

这是Python 2文档。你在Python 2上吗?Python3改变了一切。此外,您列出了一个基类,这样您就不会碰到全局变量。这不是旧式或新式的问题。如果列出了任何基类,旧式类也不会使用全局元类。另外,您的OldStyle类实际上是新样式的,您可以通过检查isinstanceOldStyle,type看到。@user2357112 isinstanceOldStyle,type按其应该的方式为我返回False,或者我缺少什么?我同意行为上的差异不是由旧样式/新样式引起的,而是由它们的定义方式引起的。@user2357112此外,即使旧样式类继承自另一个没有元类的旧样式类,也将使用全局变量。而且
new style <type 'type'>
old style <class '__main__.Meta'>