代码之家  ›  专栏  ›  技术社区  ›  Pswiss87

无法访问类对象的__getitem__

  •  0
  • Pswiss87  · 技术社区  · 12 年前

    我在动态创建类实例成员时遇到了问题。我正在尝试创建一个类对象,它的行为类似于目录,并且具有以类中包含的文件命名的实例成员。

    然而,我无法到达 __setitem__() 类的方法。 我可能处理得不对。我不确定。

    这是我的代码:

    import IPython
    import sys, os
    ipath =  IPython.utils.path.get_ipython_dir()
    tutorial_config = "%s/profile_peter/startup"%ipath
    sys.path.append(tutorial_config)
    from tutorial_helpers import directoryClass, fileClass
    ## Determine Operating System
    if sys.platform == "win32":
            OperatingSystem = "Windows"
    elif sys.platform =="linux2":
            OperatingSystem = "Linux"
    else:
        raise Exception("could not find OS")
    print OperatingSystem
    root_path = os.getcwd()
    
    
    class OS_appropriete_file():
        separator = None
        def __init__(self, rootPath, relative_path):
            self.create_separator(relative_path)
            self = fileClass(rootPath+self.separator+relative_path)
        def create_separator(self,relative_path):
            if OperatingSystem == "Windows":
                escape_sequences = ['a','b','f','t','v','n','r','x']
                self.separator = "\\"
            elif OperatingSystem == "Linux":
                self.separator = "/"
    
    
    
    class dirClass(object):
        def __init__(   self,root,newFileName):
            separator = self.create_separator(newFileName)
            self.root = root+separator+newFileName
        def create_file(self,fileName):
            FileName_withoutExtension = fileName.split(".")[0]
            print "extless:"
            print FileName_withoutExtension
            super(dirClass,self).__setitem__(FileName_withoutExtension,             OS_appropriete_file(self.root,fileName))
            #self.__class__.__dict__[FileName_withoutExtension] = OS_appropriete_file(self.root,fileName)
    def create_separator(self,relative_path):
        if OperatingSystem == "Windows":
            escape_sequences = ['a','b','f','t','v','n','r','x']
            separator = "\\"
        elif OperatingSystem == "Linux":
            separator = "/"
    
        return separator
    
    
    
    class files():
        mypackage=dirClass(root_path,"mypackage")
        mypackage.create_file("__init__.py")
        mypackage.create_file("main.py")
        ## subpackage
        subpackage1=dirClass(root_path,"subpackage1")
        subpackage1.create_file("sub1.py")
        subpackage1.create_file("__init__.py")
        subpackage2=dirClass(root_path,"subpackage2")
        subpackage2.create_file("sub2.py")
        subpackage2.create_file("__init__.py")
    
    
    if __name__ == "__main__":
        fileEx = files()
    

    当我使用导入此文件时 from referenced_paths_and_files import * 我得到错误:

    AttributeError: 'super' object has no attribute '__setitem__'
    

    我要做的是创建一个dirClass实例,该实例具有一个成员变量,该变量以参数“newFileName”命名,该参数是OS_appropriete_file的实例。

    非常感谢您的帮助!

    2 回复  |  直到 11 年前
        1
  •  1
  •   Martijn Pieters    12 年前

    object 没有 __setitem__ method ; 它不是一个支持索引的类型。只有可变的序列和映射对象实现 __集合项目__ 。该方法通常用于挂接索引分配( obj[key] = value ).

    我怀疑你想设置一个属性;如果是,请使用 setattr() 在…上 self :

    setattr(self, FileName_withoutExtension, OS_appropriete_file(self.root,fileName))
    
        2
  •  0
  •   Thales MG    12 年前

    看来你必须实现这个方法 __setitem__ 在里面 dirClass 然后才能在中使用 create_file 这个 __集合项目__ 方法是一个抽象方法/接口,每个使用它的类都必须实现它。

    This reference 可能是相关的。