我试图__dict__直接使用类似的东西修改类中的值X.__dict__['x'] += 1.这样的修改是不可能的,因为类__dict__实际上是一个mappingproxy不允许直接修改值的对象.尝试直接修改或等效的原因是我试图隐藏使用相同名称在元类上定义的属性后面的class属性.这是一个例子:
class Meta(type):
def __new__(cls, name, bases, attrs, **kwargs):
attrs['x'] = 0
return super().__new__(cls, name, bases, attrs)
@property
def x(cls):
return cls.__dict__['x']
class Class(metaclass=Meta):
def __init__(self):
self.id = __class__.x
__class__.__dict__['x'] += 1
Run Code Online (Sandbox Code Playgroud)
此示例显示了为每个实例创建自动递增ID的方案Class.该行__class__.__dict__['x'] += 1不能被替换为setattr(__class__, 'x', __class__.x + 1)因为x是property没有setter的Meta.它只是改变TypeError从mappingproxy到AttributeError从property.
我试过搞乱__prepare__,但这没有效果.实现中type已经dict为命名空间返回了一个mutable .不可变mappingproxy似乎被设置type.__new__ …