有没有办法在函数返回的 Python 对象上调用方法?

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

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

将命令传递给计算机

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

我 运行 遇到的问题是,当我 return 目录对象中的包含目录或文件时,我无法以任何方式编辑它。我会给你一个我的代码示例。

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

#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()

当前输出为:

one  two  test
one  two  test

但是输出应该是:

one two
test

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

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

它改变了 di 而不是 return 由 get_sub()

编辑的对象

非常感谢任何帮助!让我知道是否还有什么我应该提供的。

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

它改变了 di 而不是 get_sub()

编辑的对象 return

这很可能是因为无论结果如何,has_sub() 最终都会解析到一个没有其他目录的子目录。这将导致此子句成立:

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

if not self.has_sub 将评估为 true 和 return 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 and consider whether you need to worry about existing directories. os.path.join 在这里也可能是你的朋友...

  2. 好好看看你return正在做的事情。如果您 return self 您正在 return 引用您调用该方法的对象。如果你将第二个方法调用链接到那个(在你的情况下)它仍然是你调用它的di

我认为,如果您首先开始寻找 os.path as a module then consider some of the additional os functions like mkdir mentioned above. Also consider that os.getcwd() and os.chdir() 可能感兴趣的内容,那么实施此功能会很有趣。

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