【发布时间】:2021-02-20 18:18:14
【问题描述】:
使用 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
这种方法的结果是每个Folder都有相同的sub_folders列表 Image of the infinite sub_folders
我用 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;
}
编辑:
显然我创建了一个类级变量而不是实例级变量。这解决了我的错误:
EDIT2:
移除了类级变量
class Folder:
def __init__(self, path):
self.path = path
self.sub_folders = list()
【问题讨论】:
-
正在研究它——因为我认为这是一个有趣的问题。最初的想法:在 init 之前你有 path 和 sub_folders 成员。当不附加到 self(C++ 中的“this”)时,它们充当“静态”数据成员,并由同一类的所有实例共享。在 __init__() 构造函数中 self._thing = thing 是你应该做的,所以每个实例都有一个唯一的数据类实例。
-
只是你创建了一个类级别而不是实例级别的变量
sub_folders。因此,一点也不奇怪它会在每个实例之间共享......这完全是类级别变量的目的。 -
@donkopotamus 我明白了,我不知道我实际上创建了一个类级变量。谢谢!我现在修好了。
-
@drw89 ... 在您的“固定”版本中去掉类级别的
path和sub_folders...它们根本不应该存在。 -
@donkopotamus 好的,谢谢你的信息。看来我还有很多东西要学!
标签: python recursion instantiation