我想更改一个活动python对象的isinstance
的行为。在
一种解决方案是创建一个简单的包装,如下所示,但我不喜欢它:
class Widget:
def __init__(self, obj):
self.inner_self = obj
lizard = ['head', 'nose', 'tail']
wlizard = Widget(lizard)
assert(isinstance(wlizard, Widget)) # no assertion error thrown
我不喜欢这个特殊的包装器,因为我们必须先从wlizard
中提取{
我真正想要的是wlizard
的行为和蜥蜴完全一样,只是isinstance
返回{
以下类型的工作,但也有一些缺点:
class Widget:
pass
def MakeAWidget(obj):
class Blah(type(obj), Widget):
pass
# inherits type(obj)'s __init__ method
wobj = Blah(obj) # calls type(obj)'s copy constructor
return wobj
一个问题是,只有当type(obj)
的__init__()
方法接受的不仅仅是{__init__
可以接受type(obj)
的实例,当它这样做时,它会将obj
的属性复制到self
。我想要一些即使obj
没有复制构造函数也能工作的东西。下面这样的方法可能会强制复制构造函数的存在:
import copy
class Blah(type(obj), Widget):
def __init__(*args, **kwargs):
if isinstance(args[0], type(obj)):
self = copy.deepcopy(args[0])
return self
return super(type(self), self).__init__(*args, **kwargs)
但是,我宁愿不复制对象,只在适当的地方修改它。
可能会出现以下情况,但我不确定__BLAH__
是什么:
obj = ['apple', 'pear', 'banana']
assert(not isinstance(obj, Widget)) # no error thrown
obj.__BLAH__.append('Widget')
assert(isinstance(obj, Widget)) # no error thrown
我想这是你想要的。
wrap()
函数动态创建一个从传递给它的obj
参数的类派生的类,然后返回从该类创建的类的实例。这假设obj
的类支持复制构造(从相同类或派生类的实例初始化)。在相关问题 更多 >
编程相关推荐