2016-09-14 28 views
2
class fileInfo(dict): 
    def __init__(self, name, typ, size = 1): 
     self = {} 
     self["name"] = name 
     self["type"] = typ 
     self["size"] = size 

    def __getitem__(self, key): 
     if key == "name": 
      return dict.__getitem__(self, "name")+ "." + dict.__getitem__(self, "type") 
     return dict.__getitem__(self, key) 

我创造了这个班,但我与初始化功能的问题。 当我尝试初始化这个类的对象时,init函数返回一个空字典。Ιnitialising字典一样

就初始化函数而言,我不理解什么?

回答

2

此行不会做你认为它的作用:

self = {} 

这行创建dict类型的新对象,并结合本地名称self它。这与之前丢失的值self完全无关。而且,由于self是局部变量,因此该行创建的对象将在__init__()返回时标记为删除。

尝试此代替:

super(fileInfo, self).__init__() 

这既不产生也不破坏任何对象,但修改由self引用的对象。

参考:

+0

Exaclty。 'self = {}'在'__init__'中改变了'self'的含义,所以它不再引用实际的* self *,而是改为一个新的dict。 – zvone

+0

我现在明白我需要使用super,但是你能解释一下'self = {}'是做什么的吗? – docff

+0

看到我最近的编辑。 –

0

任何类的__init__方法,一旦你创建类的实例调用。您不能手动调用它来实例化类,但使用类名称。

另外,你并没有真正地初始化一个继承它的方法和属性从dict的类。你需要使用super。此外,这种情况下呼叫__init__是真实的。

class fileInfo(dict): 
    def __init__(self, name, typ, size = 1): 
     super(fileInfo, self).__init__() 

     self["name"] = name 
     self["type"] = typ 
     self["size"] = size 

    def __getitem__(self, key): 
     if key == "name": 
      return dict.__getitem__(self, "name")+ "." + dict.__getitem__(self, "type") 
     return dict.__getitem__(self, key) 

file_info = fileInfo("file-name", "txt", 100) 

print file_info["name"] 

输出:

file-name.txt