递归python函数中的实例化对象似乎保留/获取对其他实例的引用

递归python函数中的实例化对象似乎保留/获取对其他实例的引用,python,recursion,instantiation,Python,Recursion,Instantiation,使用python 3.9,我想将一个目录及其子目录映射到一个文件夹类,该文件夹类的结构如下: class Folder: path = '' sub_folders = list() def __init__(self, path): self.path = path 我使用以下代码填充主文件夹,然后使用递归填充子文件夹及其子文件夹: def get_folder(path): folder = Folder(path) sub_dir

使用python 3.9,我想将一个目录及其子目录映射到一个文件夹类,该文件夹类的结构如下:

class Folder:
    path = ''
    sub_folders = list()

    def __init__(self, path):
        self.path = path
我使用以下代码填充主文件夹,然后使用递归填充子文件夹及其子文件夹:

def get_folder(path):
    folder = Folder(path)
    sub_directories = [f.path for f in os.scandir(path) if f.is_dir()]
    for sub_directory in sub_directories:
        folder.sub_folders.append(get_folder(sub_directory))

    return folder
此方法的结果是每个文件夹都有相同的子文件夹列表

我用C#重新创建了代码(我更习惯使用C#),并且它按照预期工作

我觉得对文件夹对象的引用被保存并传递给其他对象的方式有些奇怪

参考按预期工作的C#代码:

public class Folder
{
    public List<Folder> SubFolders { get; set; } = new List<Folder>();
    public string Path { get; set; }
}

public static Folder GetFolder(string path)
{
    var folder = new Folder();
    folder.Path = path;
    var subFolders = Directory.GetDirectories(path);

    foreach (var subFolder in subFolders)
    {
        folder.SubFolders.Add(GetFolder(subFolder));
    }

    return folder;
}

我认为这可以改进,让Folder.dirs返回文件夹对象列表

您的主要逻辑显然是正确的,只是类语法。 我几乎从来没有用过电脑

class():
   member = ... # <-- 'static' variable - not sure what python calls this.

   def __init__(self):
   """ """

我认为这可以改进,让Folder.dirs返回文件夹对象列表

您的主要逻辑显然是正确的,只是类语法。 我几乎从来没有用过电脑

class():
   member = ... # <-- 'static' variable - not sure what python calls this.

   def __init__(self):
   """ """

正在研究它——因为我认为这是一个有趣的问题。最初的想法:在init之前,您有path和sub_文件夹成员。当不连接到self时(在C++中为“this”),它们充当“静态”数据成员,并由同一类的所有实例共享。在uuu init uuu()构造函数self中,_thing=thing是您应该做的事情,这样每个实例都有一个唯一的数据类实例。这只是您创建了一个类级别,而不是实例级别,变量
sub\u folders
。因此,它在所有实例中共享也就不足为奇了。。。这就是类级变量的作用。@donkopotamus我明白了,我不知道我实际上创建了一个类级变量。谢谢我现在修好了。@drw89。。。清除“固定”版本中的类级
路径
子文件夹
。。。他们根本不应该在那里。@donkopotamus好的,谢谢你提供的信息。看来我有很多东西要学!正在研究它——因为我认为这是一个有趣的问题。最初的想法:在init之前,您有path和sub_文件夹成员。当不连接到self时(在C++中为“this”),它们充当“静态”数据成员,并由同一类的所有实例共享。在uuu init uuu()构造函数self中,_thing=thing是您应该做的事情,这样每个实例都有一个唯一的数据类实例。这只是您创建了一个类级别,而不是实例级别,变量
sub\u folders
。因此,它在所有实例中共享也就不足为奇了。。。这就是类级变量的作用。@donkopotamus我明白了,我不知道我实际上创建了一个类级变量。谢谢我现在修好了。@drw89。。。清除“固定”版本中的类级
路径
子文件夹
。。。他们根本不应该在那里。@donkopotamus好的,谢谢你提供的信息。看来我有很多东西要学!
import os

class Folder:
    def __init__(self, path):
        self._path_name = path
        self._dir_names = [f.path for f in os.scandir(path) if f.is_dir()]

    def __str__(self):
        string = 'path: {}'.format(self.path)
        string += '\n'
        string += 'dirs: {}'.format(self.dirs)
        return string

    @property
    def path(self):
        return self._path_name

    @property
    def dirs(self):
        return self._dir_names


def main():
    """ Test the Folder class """
    folder = Folder('.')
    print(folder)

    for sub_folder in folder.dirs:
        folder = Folder(sub_folder)
        print(folder)


if __name__ == "__main__":
    main()