Python 对象在 mixin 注入后丢失 __dict__
Python object losing __dict__ after mixin injection
我正在尝试使用装饰器向 class 注入混合。当代码运行时,class 不再有 dict 属性,即使目录(实例)说它有一个。我不确定 属性 在哪里消失了。有没有办法让我获得 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
不是 "losing __dict__
"。发生的事情是你原来的 dummyClass
有一个 __dict__
descriptor 旨在检索你的原始 dummyClass
实例的 __dict__
属性,但是你的装饰器把那个描述符进入一个新的 dummyClass
,它不是原始的。
将原始 __dict__
描述符与新 class 的实例一起使用是不安全的,因为没有继承关系,并且新 class 的实例可能有自己的字典指针在它们的内存布局中有不同的偏移量。要解决此问题,请让您的装饰器创建一个 class,它继承自原始版本,而不是复制其 dict 和 bases:
def testDecorator(cls):
return type(cls.__name__, (Mixin, cls), {})
我正在尝试使用装饰器向 class 注入混合。当代码运行时,class 不再有 dict 属性,即使目录(实例)说它有一个。我不确定 属性 在哪里消失了。有没有办法让我获得 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
不是 "losing __dict__
"。发生的事情是你原来的 dummyClass
有一个 __dict__
descriptor 旨在检索你的原始 dummyClass
实例的 __dict__
属性,但是你的装饰器把那个描述符进入一个新的 dummyClass
,它不是原始的。
将原始 __dict__
描述符与新 class 的实例一起使用是不安全的,因为没有继承关系,并且新 class 的实例可能有自己的字典指针在它们的内存布局中有不同的偏移量。要解决此问题,请让您的装饰器创建一个 class,它继承自原始版本,而不是复制其 dict 和 bases:
def testDecorator(cls):
return type(cls.__name__, (Mixin, cls), {})