2010-01-16 58 views
3

對Python比較新,我在PyFacebook庫中看到了下面的構造(源代碼在這裏:http://github.com/sciyoshi/pyfacebook/blob/master/facebook/init.py#L660)。我很好奇它做了什麼,因爲它似乎是一個繼承自己的類。繼承自己的Python類?這個怎麼用?

class AuthProxy(AuthProxy): 
    """Special proxy for facebook.auth.""" 

    def getSession(self): 
     """Facebook API call. See http://developers.facebook.com/documentation.php?v=1.0&method=auth.getSession""" 
     ... 
     return result 

    def createToken(self): 
     """Facebook API call. See http://developers.facebook.com/documentation.php?v=1.0&method=auth.createToken""" 
     ... 
     return token 

這是幹什麼的?

切線相關,我在Eclipse中使用PyDev,並將其標記爲錯誤。我猜測事實並非如此。無論如何讓Eclipse知道這是好事?

+0

猴子修補,蟒蛇方式。 – recursive

回答

11

其中的類語句不會使該類從自身繼承,它會使用當前值AuthProxy作爲超類創建一個類對象,然後將類對象分配給變量「AuthProxy」,可能會覆蓋先前的分配AuthProxy它繼承。

實質上,它與x = f(x)大致相同:x不是f的值,沒有循環依賴 - 只有舊的x和新的x。舊的AuthProxy和新的AuthProxy。

+0

如果是這樣,那麼原來的「AuthProxy」類從哪裏來?這個類沒有任何輸入,雖然我可能認爲AuthProxy是一些泛型類,但是對於「FriendsProxy」和「PhotosProxy」使用了相同的模式。 – Bialecki

+1

這絕對是令人困惑的。不要這樣做。這絕對是進口的地方;在此定義之前粘貼「打印AuthProxy .__模塊___」以查看它來自哪裏。 –

3

它使用從不同模塊導入的AuthProxy(檢查導入)並從中導出。

+3

如果是這種情況(它可能是),這是一個* strong *參數,用於執行'import other_module',然後說'class AuthProxy(other_module.AuthProxy)'。這樣可以防止污染本地模塊的名稱空間,並且突出顯示了*出現*具有相同名稱的兩件事情,但卻是不同的事實。 –

+1

另一種選擇是'將other_module.AuthProxy作爲OtherAuthProxy'以及'AuthProxy(OtherAuthProxy)'類。 –

+0

任何一種解決方案都可能會修復PyDev錯誤報告問題。 –

3

「以前的」AuthProxy由__generate_proxies創建(它不是很好的代碼,它甚至有一個execeval :)),但作者還希望在其上定義一些方法。

+0

真棒,謝謝! – Bialecki

+5

哇,我想我只是吐了一下在我的嘴裏...... –

+0

這就像我的嘴裏有一個派對,每個人都在吐。 –

1

爲了使Eclipse停止抱怨吧,這樣做:

類AuthProxy(AuthProxy):#@ UndefinedVariable