Python 将函数转换为OOP

Python 将函数转换为OOP,python,arrays,oop,recursion,initialization,Python,Arrays,Oop,Recursion,Initialization,我有一个类似的json口述: { "name": "Root Folder", "type": "folder", "children": [ { "name": "Folder A", "type": "folder", "children": [ { "name": "Folder A-A", "type": "folder", "children": [

我有一个类似的json口述:

{
  "name": "Root Folder",
  "type": "folder",
  "children": [
    {
      "name": "Folder A",
      "type": "folder",
      "children": [
        {
          "name": "Folder A-A",
          "type": "folder",
          "children": [
            {
              "name": "File A-A-1",
              "type": "file",
              "children": []
            }
          ]
        },
        {
          "name": "Folder A-B",
          "type": "folder",
          "children": []
        }
      ]
    },
    {
      "name": "Folder B",
      "type": "folder",
      "children": [
        {
          "name": "Folder B-A",
          "type": "folder",
          "children": [
            {
              "name": "Folder B-A-A",
              "type": "folder",
              "children": []
            }
          ]
        },
        {
          "name": "Folder B-B",
          "type": "folder",
          "children": []
        }
     ]
   },
   {
      "name": "File Root",
      "type": "file",
      "children": []
   }
  ]
}
从这个命令中,我想自动获取每个成员以及级别的值“Path”、“Name”和“type”,因此root是level0,Folder A level 1,Folder AA level 2等等

为此,我创建了以下Python代码,该代码采用json字典并将其中的值放入数组中:

import json
import os
from jinja2 import Template


with open('Folder_structure.json') as f:
    data = json.load(f)

def arr4tmpl(data,arr_path,arr_name,arr_type,arr_level):

    for child in data['children']:

        arr_path.extend([child['path']])
        arr_name.extend([child['name']])
        arr_type.extend([child['type']])
        arr_level.extend([arr4tmpl.level])

        arr4tmpl.level+=1
        arr4tmpl(child,arr_path,arr_name,arr_type,arr_level)
        arr4tmpl.level-=1

    return(arr_path,arr_name,arr_type,arr_level)

def main():
    arr4tmpl.level = 0
    arr=[]
    arr_path=[]
    arr_name=[]
    arr_type=[]
    arr_level=[]

(arr_path,arr_name,arr_type,arr_level)=arr4tmpl(data,arr_path,arr_name,arr_type,arr_level)
这很好,但现在必须将其转变为面向对象的解决方案。因此我想到了以下内容(根据答案编辑,谢谢):

其思想是通过init方法初始化参数,然后在arr4tmpl方法中扩展它们。 据我所知,创建对象应该执行init方法,但在执行代码时,我得到错误:

File "Folder_structure.py", line 34, in <module>
template.arr4tmpl(data,level)
NameError: name 'level' is not defined
文件“Folder_structure.py”,第34行,在
模板arr4tmpl(数据,级别)
NameError:未定义名称“级别”

当您想要修改对象变量时,必须使用self引用它们

def arr4tmpl(self,data,level):
    for child in data['children']:    

        self.arr_path.extend([child['path']])
        self.arr_name.extend([child['name']]) 
        self.arr_type.extend([child['type']])
        self.arr_level.extend([level])

        self.level+=1
        self.arr4tmpl(self,child,level) #BUT this line will cause all sorts of recursion issues, since you don't have a stop criteria
        self.level-=1


    return(arr_path,arr_name,arr_type,arr_level)

啊,是的,我真的找到了一个方法:

import json
import os
from jinja2 import Template

class CreateTemplate(object):

    arr_path=[]
    arr_name=[]
    arr_type=[]
    arr_level=[]
    level=0



    def arr4tmpl(self,data):
        for child in data['children']:

            self.arr_path.extend([child['path']])
            self.arr_name.extend([child['name']])
            self.arr_type.extend([child['type']])
            self.arr_level.extend([self.level])

            self.level+=1
            self.arr4tmpl(child)
            self.level-=1


        return(self.arr_path,self.arr_name,self.arr_type,self.arr_level)


with open('Folder_structure.json') as f:
    data = json.load(f)
template=CreateTemplate()

template.arr4tmpl(data)
我不确定init为什么不能工作,因为我认为它会在创建对象时初始化参数,然后这些变量可以用于方法arr4tmpl


也不确定arr4tmpl方法是否可以改进,但至少它现在确实创建了这些阵列。谢谢

您没有调用类的成员不要忘记,您仍然需要在
arr4tmpl
方法中引用
self
——因此
arr\u path.extend(…)
应该是
self.arr\u path.extend(…)
,等等。欢迎使用StackOverflow。请按照您创建此帐户时的建议,阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。“不工作”不是一个问题规范。
import json
import os
from jinja2 import Template

class CreateTemplate(object):

    arr_path=[]
    arr_name=[]
    arr_type=[]
    arr_level=[]
    level=0



    def arr4tmpl(self,data):
        for child in data['children']:

            self.arr_path.extend([child['path']])
            self.arr_name.extend([child['name']])
            self.arr_type.extend([child['type']])
            self.arr_level.extend([self.level])

            self.level+=1
            self.arr4tmpl(child)
            self.level-=1


        return(self.arr_path,self.arr_name,self.arr_type,self.arr_level)


with open('Folder_structure.json') as f:
    data = json.load(f)
template=CreateTemplate()

template.arr4tmpl(data)