2014-08-27 4 views
1

Пытается рекурсивно пройти через каталоги, чтобы найти файлы, которые не находятся в каталогах источника и dest. Когда я переписываю каталоги, я передаю предыдущую переменную каталога, чтобы я знал структуру рабочего каталога в исходном каталоге (потому что рабочие каталоги совпадают как с каталогами 0 & dest).переменная экземпляра неожиданно изменяется

Если мой первый рабочий каталог «Дира», то переменная self.working становится «Дира». Если я перейду в 'dirA/dirB' и пройдите self.working назад к методу recurse, то (что я думаю, это новый экземпляр) переменная working становится 'dirA/dirB'. Когда это делается в 'dirB' и возвращается к 'dirA', self.working по-прежнему 'dirA/dirB'.

Если я просто принимаю self. от working, все работает как ожидается (потому что working теперь является статической переменной?). Когда я звоню self.recurse, это действительно создает новый экземпляр recurse правильно? Я также передаю новый список как переменную экземпляра, но с этим ничего странного.

Я предполагаю, что следующий вопрос будет следующим: когда я должен явным образом объявлять переменные экземпляра, и когда я должен просто принимать переменные, которые передаются с помощью метода?

Это рационализированная версия кода, который не работал. Я вытащил все остальные вещи, потому что это единственная проблема, с которой я связан, а остальная часть не влияет на эту часть. Я создаю 'dirA' & 'dirB' списки в статьях if, потому что в фактическом коде я создаю там список текущего содержимого каталога.

source = 'dirS/' 
c_SD_list = ['dirA', 'fileA'] 

class checkFiles(object): 
    def __init__(self, source): 
     self.source = source 

    def recurse(self, current_list, working): 
     self.current_list = current_list 
     self.working = working 
     for a in self.current_list: 
      self.full = self.working + a 
      if a == 'dirA': 
       self.new_list = ['dirB', 'fileA_1', 'fileA_2'] 
       self.recurse(self.new_list, self.full + '/') 
      elif a == 'dirB': 
       self.new_list = ['fileB_1', 'fileB_2'] 
       self.recurse(self.new_list, self.full + '/') 
      else: 
       print(self.source + self.full) 

checker = checkFiles(source) 
checker.recurse(c_SD_list, '') 

Я гугл в течение половины дня, читал старые вопросы здесь, документы и сообщения, описывающие переменный экземпляр, ООП в целом, и т.д ... до сих пор не в состоянии понять, почему это происходит. Поэтому, если я пропустил ответ, который кто-то уже положил, пожалуйста, простите меня и любезно укажите на него. Благодаря!

ответ

0

Callling self.recurse() не создает никаких новых объектов, поэтому self.current_list будет указывать на один и тот же объект.

Если вы хотите создать новый объект, когда вы рекурсии, попробуйте checkFiles(self.source).recurse()

EDIT: В ответ на ваш последующий вопрос:

Вы должны только делать переменные экземпляра, если они отражают некоторые качества этого объекта, а не состояние некоторой функции. И как примечание личного стиля, вы вообще не должны создавать их вне своего конструктора, но это зависит от личного вкуса.

+0

'self.working' не изменяется, поскольку он поднимается по дереву, потому что он все еще указывает на тот же объект. Если вы хотите, чтобы работа оставалась между вызовами, не используйте ее как атрибут экземпляра, а только локальную переменную. – user2085282

+0

А, это имеет смысл. Благодаря! Еще один вопрос, почему вы предлагаете не создавать переменные экземпляра вне конструктора? – ben

+0

Nevermind, я использовал свой мозг и googled. – ben

Смежные вопросы