2010-11-08 40 views
1

我有一個python問題,我敢肯定它非常簡單 - 請隨時在我處理任何類型的不良練習時隨時關注我。我有以下代碼:python 2.7 __init__對自己的行爲

class User(dict,BaseDBI): 
    def __init__(self,uid=None,username=None): 
     self['uid']=str(uuid())  
     if uid == None and username is not None:    
      uid_struct = self.Get('data/username.kch',username)   
      if uid_struct is not None: 
       self = self.Get('data/user.kch',uid_struct['uid']) 

正如你可以告訴這個用戶只是一個擴展的字典對象。它還可以在一些Kyoto Cabinet數據庫文件上訪問幾個簡單的Get和Set方法。我把一些打印語句是通過什麼回事跟蹤,一切都得到了適當的設置,但是當我創建了一個用戶對象(例如):

user = User(username='someusername') 

,然後打印用戶我只有具有新的字典對象全新uid第一行生成__init__

感謝您的任何智慧!

+0

什麼問題? – 2010-11-08 18:00:52

+0

爲什麼它從字典繼承呢?你確定你不想調用基類'__init__'嗎?當然你得到一個'dict',它應該是一個*看起來像一個字典的對象? – 2010-11-08 18:02:43

回答

2

python變量是引用。當您分配給self時,您將替換該引用,但不會更改由__init__返回的對象。

最簡單的事情可能是簡單地使用dict.update方法將所有鍵/值對複製到self。這應該是「正常工作」,因爲你已經從字典繼承。

繼承僅適用於像A is a B這樣的關係。您指出用戶是字典,沒關係,但我懷疑用戶是BaseDBI。這更可能是你想要一個用戶有一個數據庫,在這種情況下組合更合適。這可能看起來很挑剔,但會阻止你製造奇怪和淫穢的系統。

+0

非常感謝你的幫助。另外,感謝您提供的構圖建議 - 現在得到反饋比晚些時候更好。 – swasheck 2010-11-08 18:18:52

0

您需要調用繼承的構造函數。喜歡的東西:

def __init__(self,uid=None,username=None): 
    dict.__init__(self) 
    BaseDBI.__init__(self) 

而且分配給self將只需更換局部變量self值。它不會對物體產生任何影響。

0

如果需要返回一個已經存在的實例或類,你需要定義一個__new__方法

的時候__init__被調用時,一個新的實例已經創建

+0

謝謝。據我所知,這將永遠是一個新鮮的事例。 – swasheck 2010-11-08 18:27:13

+0

@swasheck,啊,看起來你並不是真的想重新綁定自己 – 2010-11-08 18:29:24