我正在尝试将一个mixin注入一个带有装饰器的类。当代码运行时,类不再具有 dict 属性,即使dir(实例)说它有一个。我不确定房产在哪里消失。有没有办法可以获得 dict 或以其他方式找到实例的属性?
def testDecorator(cls):
return type(cls.__name__, (Mixin,) + cls.__bases__, dict(cls.__dict__))
class Mixin:
pass
@testDecorator
class dummyClass:
def __init__(self):
self.testVar1 = 'test'
self.testVar2 = 3.14
inst = dummyClass()
print(dir(inst))
print(inst.__dict__)
如果装饰器被注释掉,但是当装饰器存在时导致错误,则此代码有效。在python 3.5.1上运行
答案 0 :(得分:3)
没有"失去__dict__
"。发生的事情是,您的原始dummyClass
有一个__dict__
descriptor,旨在检索原始__dict__
实例的dummyClass
属性,但是装饰器将该描述符放入一个不会从原始位置下降的新dummyClass
。
将原始__dict__
描述符与新类的实例一起使用是不安全的,因为没有继承关系,并且新类的实例可能将其dict指针指向a内存布局中的不同偏移量。要解决这个问题,请让你的装饰师创建一个从原版下降而不是复制其字典和基础的类:
def testDecorator(cls):
return type(cls.__name__, (Mixin, cls), {})