繁体   English   中英

有没有办法在 function 返回的 Python object 上调用方法?

[英]Is there a way to call a method on a Python object returned by a function?

所以我正在 Python 中构建一个命令行教程程序。 基本上它模拟一个终端并使用 shell 命令引导您完成不同的级别。 原始版本的工作方式是我捕获输入的任何内容并分析它以调用教程程序(如果没有任何内容)我使用 os.system() 将命令传递给计算机。

不幸的是,由于我编写的教程是针对 *nix 系统的,因此它不适用于 Windows,因为我包含了使用 vim 之类的关卡。 我的计划是重写程序,但不是调用系统,而是创建一个虚拟文件系统。 这包括对象:目录和文件。 您可能会弄清楚这两个对象的含义。 目录 object 将包含其内容列表,这将充当文件系统。 然后,我将执行 cd、ls、pwd 等命令。

我遇到的问题是,当我从目录 object 返回包含目录或文件时,我无法以任何方式对其进行编辑。 我会给你一个我的代码的例子。

注意:代码中可能存在错误,因为如果不解决此问题,我无法很好地测试它此外,导入对于问题来说不是必需的。 第一个是颜色 class ,它列出了执行彩色 output 的代码,第二个是包含全局变量的文件。 我已经删除了对这些资源的调用,以便它可以在其他人的系统上运行

#from ..resources.colors import colors
#from ..resources import variables as var

class Directory:
    # Basic constructor
    def __init__(self, name="", container=None, contents=[]):
        self.name = name
        self.container = container
        self.contents = contents
    
    # grabs index of contents by name
    def index(self, find):
        for i in range(len(self.contents)):
            if self.contents[i].name == find:
                return i
        return -1
    
    # Add something to the container
    def add(self, dirFile):
        # Check for duplicate names
        if self.index(dirFile.name) != -1:
            return False

        self.contents.append(dirFile)
        return True

    # Retrieve something that's in contents
    def get(self, neededName):
        ind = self.index(neededName)
        if ind >= 0:
            return self.contents[ind]

    # Returns true if it has at least one sub directory
    def has_sub(self):
        for content in self.contents:
            if type(content) == Directory:
                return True
        return False
    
    # Iterates through, looks for slashes and goes to subs (recursion, ooooh!)
    def get_sub(self, path=""):
        if not self.has_sub() or path == "":
            return self
        
        pathSplit = path.split("/")
        nextDir = self.index(pathSplit[0])
        
        if nextDir >= 0:
            return self.contents[nextDir]
        
        pathSplit.pop(0)
        path = "/".join(pathSplit)
        return self.get_sub(path)


        
            

    # ============== Shell Commands ==============

    # List all contents in directory
    def ls(self):
        for content in self.contents:
            if type(content) == Directory:
                #print(colors.fg.blue + content.name + colors.reset + "\t", end="") This is the code wih the colors class
                print(content.name + "\t", end="")
            else:
                print(content.name + "\t", end="")
        print()

    # Delete file by name:
    def rm(self, toDelete):
        ind = self.index(toDelete)
        if ind >= 0:
            self.contents.pop(ind)
            return True
        else:
            return False
    
    # Make new dir
    def mkdir(self, name=""):
        if name:
            self.add(Directory(name))
            
        
## Current test
di = Directory("Test")
di.mkdir("one")
di.mkdir("two")

di.get_sub("one").mkdir("test")

di.ls()
di.get_sub("one").ls()

当前的output为:

one  two  test
one  two  test

但是 output 应该是:

one two
test

出于某种原因,当我打电话时:

di.get_sub("one").mkdir("test")

它改变了 di 而不是 get_sub() 返回的 object

任何帮助都非常感谢。 让我知道是否还有其他我应该提供的东西。

我想我可以给你一些建议。 第一个可能最合适的是回答您的主要问题:

它改变了 di 而不是 get_sub() 返回的 object

这很可能是因为无论事情如何发展,has_sub() 最终都会解析到一个没有其他目录的子目录。这将导致该子句变为 true:

        if not self.has_sub() or path == "":
            return self

if not self.has_sub将评估 true 并返回di 它总是di因为你的递归例程总是调用self上的方法,即di 我希望这是有道理的!

关于我可以给你的第二个指针,也许我可以问几个关于你的测试用例的问题,这可能有助于一些发现和通过过程:

1: di = Directory("Test")
2: di.mkdir("one")
3: di.mkdir("two")

4: di.get_sub("one").mkdir("test")

5: di.ls()
6: di.get_sub("one").ls()
  1. 在第一行创建Test ,然后添加 (2) 和 (3) 新的(我想)子目录。 但是,在您的 Directory 实现中查看 mkdir ,这些实际上并没有被创建。 也许看看os.mkdir并考虑您是否需要担心现有目录。 os.path.join也可能是你的朋友......

  2. 好好看看你要返回的东西。 如果您return self您将返回对您调用该方法的 object 的引用。 如果你将第二个方法调用链接到那个(在你的情况下)它仍然是你调用它的di

我认为,如果您首先开始研究os.path作为一个模块,然后考虑一些附加的 os 函数,例如上面提到的 mkdir,那么您将获得很多乐趣。 还要考虑到os.getcwd()os.chdir()可能很有趣。

我真的希望这会有所帮助。 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM