2015-04-23 132 views
2

我試圖爲unix find-command編寫一個小包裝腳本。東西我搞砸了參數傳遞。你能給我一個關於我的錯誤的暗示嗎?Python - 被類和實例變量困惑

的錯誤消息是

Traceback (most recent call last): 
    File "frep.py", line 43, in <module> 
    inst.prep_shell_commands(self.extension, self.search_string, self.rel_numbers) 
NameError: name 'self' is not defined 

這是代碼:

import os 
import subprocess 
import string 
import sys 


class Frep(object): 

    extension = "" 
    search_string ="" 
    commands = [] 
    rel_numbers = "" 


    def get_params(self): 
     Frep.no_of_params = len(sys.argv) 
     if Frep.no_of_params == 4: 
      Frep.extension = str(sys.argv[1]) 
      Frep.search_string = str(sys.argv[2]) 
      Frep.rel_numbers = str(sys.argv[3]) 
     else: 
      print "Usage: frep [FILE_EXTENSION] [SEARCH_STRING] [RELEASE_NUMBERS]" 
      print "Example: frep sql my_search_string [5-6]" 
      print " " 
      sys.exit() 


    def prep_shell_commands(self, ext, ss, reln): 
     print ext 
     tmp_folderlist = string.split(subprocess.check_output("find /data/grep_dir -maxdepth 1 -type d -name '["+reln+"]*'", shell=True), '\n') 
     #tmp_folderlist = string.split(subprocess.check_output("find /data/grep_dir -maxdepth 1 -type d -name '[6-7]*'", shell=True), '\n') 
     for d in tmp_folderlist: 
      commands.append("find " + d + " -type f -name '*" + ext +"' -exec grep -il '" + ss +"' {} \;") 
     print commands 


    def exec_commands(self, c_list): 
     for c in c_list: 
      os.system(c) 


inst = Frep() 

inst.prep_shell_commands(self.extension, self.search_string, self.rel_numbers) 

exec_commands(self.commands) 
+0

'self'只存在於以它爲參數的方法中。你正試圖在其他地方使用它。 – Kevin

+0

所以我如何訪問這個實例的類變量? – royskatt

+0

您不訪問實例的類變量。您可以訪問該類的類變量。有「類變量」和「實例變量」。 「擴展名」是一個類變量,可通過「Frep.extension」進行訪問。 – paidhima

回答

2

這裏是你的代碼的重寫。這個版本並不完美,但它展示瞭如何定義一個類如何使用一個類實例,它通常是用Python完成的。

FWIW,它可能會更好地驗證輸入數據,然後再將它傳遞到你的班級,但我想這裏沒關係。

我沒有測試過這段代碼,因爲我沒有所需的目錄和文件,但希望它不包含任何可怕的錯誤。 :)

#!/usr/bin/env python 

import os 
import subprocess 
import sys 

class Frep(object): 
    def __init__(self, args): 
     if len(args) != 3: 
      self.usage() 

     self.extension = args[0] 
     self.search_string = args[1] 
     self.rel_numbers = args[2] 
     self.commands = [] 

    def usage(self): 
     print "Usage: frep FILE_EXTENSION SEARCH_STRING RELEASE_NUMBERS" 
     print "Example: frep sql my_search_string [5-6]" 
     print " " 
     sys.exit() 

    def prep_shell_commands(self): 
     print self.extension 
     cmd = "find /data/grep_dir -maxdepth 1 -type d -name '[" + self.rel_numbers + "]*'" 
     tmp_folderlist = subprocess.check_output(cmd, shell=True).split('\n') 

     for d in tmp_folderlist: 
      cmd = "find " + d + " -type f -name '*" + self.extension + "' -exec grep -il '" + self.search_string + "' {} \;" 
      self.commands.append(cmd) 
     print self.commands 

    def exec_commands(self): 
     for cmd in self.commands: 
      os.system(cmd) 


def main(): 
    inst = Frep(sys.argv[1:]) 
    inst.prep_shell_commands() 
    inst.exec_commands() 


if __name__ == '__main__': 
    main() 
+0

謝謝你! – royskatt

2

Frep實例,在那裏你列出以下:

extension = "" 
search_string ="" 
commands = [] 
rel_numbers = "" 

爲了能夠正確訪問這些變量,您需要執行以下操作:

class Frep(object): 
    def__init__(self): 
     self.extension = "" 
     self.search_string = "" 
     self.commands = [] 
     self.rel_numbers = "" 

然後,當您在班級中引用這些變量時,可以使用self.variablename

要在課堂外引用它們,您可以使用Frep.extension

+2

你想'Frep.extension',而不是'Frep.extension()'。這不是一種方法。 – Kevin

+2

您可以使用OP使用的語法初始化屬性。然而,這些變量是類屬性,它們與實例變量的行爲非常不同。 有關它們如何工作的非常好的解釋可以在這裏找到http://www.toptal.com/python/python-class-attributes-an-overly-thorough -指南。 –

3

您使用對象

inst.prep_shell_commands(inst.extension, inst.search_string, isnt.rel_numbers) 

話雖這麼說的實例的名稱引用一個實例成員,如果你的方法總是會被調用實例變量,那麼你應該重寫你prep_shell_commands方法,以便它不需要參數。