2011-10-09 40 views
5

請原諒我,如果我對這裏顯而易見的事情一無所知,但如果您將某個調用保存到超級變量中並稍後使用,會發生什麼情況。如果將某個調用保存到變量中以供將來使用,會發生什麼情況?

這裏是類定義的一部分,向你展示我的意思。

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 

這是在我實施這個CaselessDict類的時候出現的,幾乎所有的方法都超級了。

回答

4

預計發生的事情:self.super將只持有一個super對象,其行爲就像super(CaselessDict, self)一樣。

這種方法的問題是每個實例只有一個super屬性,所以如果你有更多的類將使用這種技術,只有最後一個分配給super才能正常工作。哎喲!所以,這通常不是一個好主意。你可能名稱的屬性__super所以它受到損壞,但我建議只是打電話super(CaselessDict, self),像其他人一樣。

當然,Python 3中的草更綠,其中一個普通的super()調用就足夠了。

0

宇宙會炸燬。不,不會發生任何錯誤,即使這不是通常的用法。爲了記錄,在Python 3中,您可以使用super().foo(...),因此在那裏基本沒有用處。

0

我有一個合法的情況,我做這種事情,涉及動態加載和重新加載的類。下面是加載模塊「」含有類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'> 

現在,如果我重新導入「一」,看看我打電話isinstance與先前創建的aobj發生了什麼:

>>> a = imp.load_module("a", *m) 
>>> print a.A 
<class 'a.A'> 
>>> isinstance(aobj, a.A) 
False 

這如何與超是像Python 2.6的,super(AClass,self)添加了檢查,以確保自身的參考確實ACLASS的一個實例。在我的情況下,我使用超「A」的方法,但一旦「a」模塊重新導入並重新定義「A」類,我的超級引用不再有效! a.A類已經改變爲我現有的a.A實例不再是實例,因此super(a.A, self)將開始引發TypeErrors。爲了解決這個問題,我基本上做了OP的工作:在__init__中,我將超級引用保存到一個實例變量中,然後在其他方法中使用該實例變量以上調基類方法。

這裏是我的完整(也許有點散漫)blog post

相關問題