Python 如果在变量中保存对super的调用以供将来使用,会发生什么情况?
如果我不知道这里的显而易见之处,请原谅,但是如果您将对super的调用保存在一个变量中并在以后使用它,会发生什么呢 下面是类定义的一部分,向您展示我的意思Python 如果在变量中保存对super的调用以供将来使用,会发生什么情况?,python,super,Python,Super,如果我不知道这里的显而易见之处,请原谅,但是如果您将对super的调用保存在一个变量中并在以后使用它,会发生什么呢 下面是类定义的一部分,向您展示我的意思 class CaselessDict(dict): def __init__(self, *args, **kwargs): self.super = super(CaselessDict, self) # save super self.update(*args, **kwargs) de
class CaselessDict(dict):
def __init__(self, *args, **kwargs):
self.super = super(CaselessDict, self) # save super
self.update(*args, **kwargs)
def __getitem__(self, key):
key = self.parsekey(key)
return self.super.__getitem__(key) # use saved super
这是在我实现这个caseslessdict类时出现的,几乎每个方法都包含super。宇宙将爆炸。不,不应该发生任何错误,即使这不是通常的用法。作为记录,在Python 3中,您可以只使用
super().foo(…)
,因此在那里做基本上是无用的。预期的事情发生了:self.super
将只保存一个super
对象,其行为就像super(CaselessDict,self)
这种方法的问题是每个实例只有一个super
属性,因此如果有更多的类使用这种技术,那么只有最后分配给super
的类才能正常工作。哎哟所以,这样做通常不是一个好主意。您可以将属性命名为\uu super
,这样它就会被损坏,但我建议您只需像其他人一样调用super(CaselessDict,self)
当然,Python3中的草更绿,简单的
super()
调用就足够了。我有一个合法的案例,我必须做这种事情,涉及动态加载和重新加载的类。以下是加载包含类a的模块“a”并创建其实例的代码段:
>>> import imp
>>> m = imp.find_module("a")
>>> a = imp.load_module("a", *m)
>>> a.A
<class 'a.A'>
>>> aobj = a.A()
>>> aobj.__class__
<class 'a.A'>
导入imp
>>>m=imp.find_模块(“a”)
>>>a=冲击载荷模块(“a”,*m)
>>>a.a
>>>aobj=a.a()
>>>aobj.uuu类__
现在,如果我重新导入“a”,看看如果我使用先前创建的aobj调用isinstance会发生什么:
>>> a = imp.load_module("a", *m)
>>> print a.A
<class 'a.A'>
>>> isinstance(aobj, a.A)
False
>a=imp.load\u模块(“a”,*m)
>>>印刷a.a
>>>isinstance(aobj,a.a.)
假的
这与super的关系是,在Python2.6中,super(AClass,self)
添加了检查,以确保self引用确实是AClass的实例。在我的例子中,我在“a”的方法中使用了super,但是一旦“a”模块被重新导入,“a”类被重新定义,我的super引用就不再有效了!a.a类已更改为我现有的a.a实例不再是的实例,因此super(a.a,self)
将开始引发类型错误。为了解决这个问题,我基本上做了OP所做的事情:在\uuuu init\uuuu
中,我将对super的引用保存到一个实例变量中,然后在其他方法中使用该实例变量向上调用基类方法
这是我的全部(也许有点漫无边际)