Python 如果在变量中保存对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

如果我不知道这里的显而易见之处,请原谅,但是如果您将对super的调用保存在一个变量中并在以后使用它,会发生什么呢

下面是类定义的一部分,向您展示我的意思

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的引用保存到一个实例变量中,然后在其他方法中使用该实例变量向上调用基类方法

这是我的全部(也许有点漫无边际)