混合注入后Python对象丢失__dict__

时间:2017-12-27 19:19:45

标签: python oop mixins python-decorators

我正在尝试将一个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上运行

1 个答案:

答案 0 :(得分:3)

没有"失去__dict__"。发生的事情是,您的原始dummyClass有一个__dict__ descriptor,旨在检索原始__dict__实例的dummyClass属性,但是装饰器将该描述符放入一个不会从原始位置下降的新dummyClass

将原始__dict__描述符与新类的实例一起使用是不安全的,因为没有继承关系,并且新类的实例可能将其dict指针指向a内存布局中的不同偏移量。要解决这个问题,请让你的装饰师创建一个从原版下降而不是复制其字典和基础的类:

def testDecorator(cls):
    return type(cls.__name__, (Mixin, cls), {})