Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python2.7在self上的初始化行为_Python_Initialization - Fatal编程技术网

Python2.7在self上的初始化行为

Python2.7在self上的初始化行为,python,initialization,Python,Initialization,我有一个python问题,我相信这个问题很简单——请随时告诉我任何不好的做法。我有以下代码: 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.Ge

我有一个python问题,我相信这个问题很简单——请随时告诉我任何不好的做法。我有以下代码:

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'])
可以看出,这个用户只是一个扩展的dict对象。它还访问了一些简单的Get和Set方法,这些方法用于两个Kyoto Cabinet db文件。我输入了一些打印语句来跟踪正在发生的事情,并正确设置了所有内容,但是当我创建用户对象(例如)时:

然后打印用户I只有一个新的dict对象,该对象具有由
\uuuu init\uuuu
下的第一行生成的全新
uid


谢谢你的智慧

python变量是引用。当您指定给
self
时,您将替换该引用,但不会更改
\uuuu init\uuuu
返回的对象

最简单的方法可能是简单地使用dict.update方法将所有键/值对复制到
self
中。这应该“起作用”,因为您已经继承了dict


继承仅适用于像
a是B
这样的关系。您指出用户是dict,这很好,但我怀疑用户是BaseDBI。您更可能希望用户拥有一个数据库,在这种情况下,组合更合适。这似乎有点吹毛求疵,但会阻止您创建怪异和淫秽的系统。

您需要调用继承的构造函数。比如:

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

同时赋值给
self
只会替换局部变量
self
中的值。它不会对对象产生任何影响。

如果需要返回已存在的实例或类,则需要定义一个
\uuuuuuu新方法


在调用
\uuuu init\uuuuu
时,已经创建了一个新实例

为什么它会从dict继承?您确定不想同时调用基类
\uuuuu init\uuuuu
?确定您得到了一个
dict
,它应该是一个看起来像dict的对象吗?非常感谢您的帮助。另外,谢谢你的作文建议-现在得到反馈比以后更好。谢谢。据我所知,这将永远是一个新的例子。@swasheck,啊,看起来你不是真的想重新绑定自己
def __init__(self,uid=None,username=None):
    dict.__init__(self)
    BaseDBI.__init__(self)