Python对象混入注射
我试图注入一个mixin与一装饰类后失去__dict__。当代码运行该类已不再具有即使目录(实例)说,它有一个字典财产。我不确定房屋在哪里消失。有没有一种方法,我可以得到字典或以其他方式找到实例的属性?Python对象混入注射
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__)
如果装饰被注释掉但此代码导致错误时,装饰是存在的。运行在蟒蛇3.5.1
回答:
这不是“失去__dict__
”。发生了什么事是你的原始dummyClass
有一个__dict__
descriptor旨在检索原始dummyClass
实例的__dict__
属性,但是您的装饰器将该描述符放入不会从原始下降的新dummyClass
。
将原始__dict__
描述符与新类的实例一起使用是不安全的,因为不存在继承关系,并且新类的实例的内存布局中的dict指针可能位于不同的偏移处。为了解决这个问题,有你的装饰打造,从原来的下降,而不是复制它的字典和基础类:
def testDecorator(cls): return type(cls.__name__, (Mixin, cls), {})
以上是 Python对象混入注射 的全部内容, 来源链接: utcz.com/qa/267122.html