首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -被类和实例变量混淆了

Python -被类和实例变量混淆了
EN

Stack Overflow用户
提问于 2015-04-23 14:41:04
回答 3查看 173关注 0票数 3

我试图为unix命令编写一个小包装脚本。我把参数传递搞砸了。你能告诉我我的错误吗?

错误信息是

代码语言:javascript
复制
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

这是代码:

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-23 15:16:54

这是你的代码的重写。这个版本并不完美,但它展示了如何定义类&如何以Python中通常使用的方式使用类实例。

FWIW,在将输入数据传递到您的类之前,最好先验证它,但我想在这里可以。

我还没有测试这段代码,因为我没有必需的目录和文件,但希望它不会包含任何可怕的错误。:)

代码语言:javascript
复制
#!/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()
票数 3
EN

Stack Overflow用户

发布于 2015-04-23 14:49:13

通过使用对象实例的名称来调用实例成员。

代码语言:javascript
复制
inst.prep_shell_commands(inst.extension, inst.search_string, isnt.rel_numbers)

尽管如此,如果您的方法总是要调用实例变量,那么您应该重写您的prep_shell_commands方法,以便它不需要任何参数。

票数 4
EN

Stack Overflow用户

发布于 2015-04-23 14:48:44

Frep实例中,列出以下内容:

代码语言:javascript
复制
extension = ""
search_string =""
commands = []
rel_numbers = ""

要正确访问这些变量,您需要执行以下操作:

代码语言:javascript
复制
class Frep(object):
    def__init__(self):
        self.extension = ""
        self.search_string = ""
        self.commands = []
        self.rel_numbers = ""

然后,当您引用类中的这些变量时,可以使用self.variablename

要在类之外引用它们,您可以使用Frep.extension

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29826802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档