2015-04-23 84 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方法,以便它不需要参数。