2010-11-08 37 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