侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

20170216--PYthon 类 +面向对象编程+(文件的处理+echo小程序的实现)

2023-11-26 星期日 / 0 评论 / 0 点赞 / 55 阅读 / 22788 字

PYthon 类 面向对象编程 1.封装 2.继承 3.重载/覆盖 class 机器: 动力 = “” def 做事情(): pass洗衣机 = 机器 //洗衣机就是实例print

PYthon 类 面向对象编程

1.封装

2.继承

3.重载/覆盖
 

class 机器:    动力 = “”    def 做事情():    pass洗衣机 = 机器 //洗衣机就是实例print 洗衣机.动力洗衣机.做事情()

封装:

继承:机器是洗衣机的父类,机器继承object(基类,最顶层的类)

类里面定义的函数就是类实例的方法。类里定义的方法第一个参数是默认的self

 

__init__(  )  //一个特殊的方法,当模块被调用的时候,最先执行的就是__init__()方法

__file__  //可以调用个这个方法查看我们调用的方法的路径

接口的封装

比较完整的定义一个类的方法,注释也会出现在相应的帮助文档里

1 #!/usr/bin/env python  2 # coding: utf8  3 #  4 """这是模块的文档字符串  5 详细帮助请阅读源代码"""  6   7 class JQ(object):  8     """这是JQ类的文档字符串"""  9     dong_li = "电" 10  11     def add_dl(self): 12         """增加动力的方法""" 13         print "增加动力" 14  15     def do(self): 16         """这是机器做事情的方法""" 17         print "我正在做事情" 18  19 class XYJ(JQ): 20     def do(self, abc): 21         """这是洗衣机做事情的方法""" 22         print "动力: " + self.dong_li 23         self.add_dl() 24         print "洗" + abc 25  26 class QC(JQ): 27     dong_li = "油" 28  29     def do(self): 30         """这是汽车做事情的方法""" 31         print "动力: " + self.dong_li 32         self.add_dl() 33         print "Run..." 34  35  36 if __name__ == "__main__": 37     print "=======  bosspc" 38     bosspc = JQ() 39     print bosspc.dong_li 40     bosspc.do() 41  42     print "/n=======  haier_abc" 43     haier_abc = XYJ() 44     print haier_abc.dong_li 45     haier_abc.do("脏衣服") 46  47     print "/n=======  bmw_123" 48     bmw_123 = QC() 49     print bmw_123.dong_li 50     bmw_123.do()

 

import commands //导入模块,可以在python 中使用shell命令还有subprocess ,是比较常用的shell模块

import shutil  //有copytree目录

  1 #!/usr/bin/python  2 #_*_ coding:utf8 _*_  3 #Filename:备份文件  4 #  5 import os  6 import sys  7 import commands  8 import shutil  9  10 if os.getuid() != 0: 11     print "请使用超级用户运行!" 12     sys.exit(1) 13  14 srcfile = "/etc/" 15  16 if not os.path.exists(srcfile): 17     print "%s 文件不存在" % srcfile 18     sys.exit(2) 19  20 #status, output = commands.getstatusoutput("cp %s /tmp/" %srcfile) 21 # 22 #if status !=0: 23 #    print "备份失败:%s" % output 24 #    sys.exit(3) 25 # 26 #print "备份成功" 27 # 28 #try: 29 #    shutil.copytree(srcfile,"/tmp/") 30 #    print "备份成功" 31 #except: 32 #    print "备份失败" 33  34 dstdir_name = os.path.basename(srcfile.rstrip("/"))  //取出备份文件的名字,去掉右边的/ 35  36 if os.path.isfile(srcfile): 36  37 if os.path.isfile(srcfile): 38     shutil.copy2(srcfile, "/tmp") 39 elif os.path.isdir(srcfile): 40     shutil.copytree(srcfile, os.path.join("/tmp", dstdir_name), symlinks=True)  //拷贝软链接,而不用去拷贝软链接对应的文件 。join函数,将函数名链接起来 41 else: 42     print "不支持备份这种文件!" 43     sys.exit(4) 44  45 print "备份成功"

 

python的一些参考手册

用这条命令可以将当前文件夹作为web的内容共享出来,访问的时候,只需要在输入本机的ip地址加8080端口就可以访问了。

模块的学习

1.临时文件模块

mktmp //在shell中生成临时文件

tmpfile //在python中生成临时文件的模块

           seek(0)//指针偏移到开头

 

 

>>> f = tempfile.TemporaryFile()  //用TemporaryFile()创建的文件没有文件名>>> f.name'<fdopen>'>>> f.write("hello,everyone!/n")  //f.write 写入内容后,指针自动跳到字符串的末尾>>> f.read()  //指针现在在字符串末尾,f.read 显示指针后面的内容,于是就什么都没有''>>> f.seek(0)  //我们将指针指到字符串的头部>>> f.read()   //f.read 执行后,指针又跳到字符串的末尾'hello,everyone!/n'>>> f.write("world")>>> f.seek(0)>>> f.read()'hello,everyone!/nworld'>>> f.seek(0)>>> f.write("kitty")>>> f.read()',everyone!/nworld'>>> f.seek(0)>>> f.read()'kitty,everyone!/nworld'>>> f.seek(0, 2)    //指针跳到字符串的末尾>>> f.write(" xx")>>> f.seek(0)>>> f.read()'kitty,everyone!/nworld xx'>>>f.close()  //关闭临时文件,临时文件会被删除 

2.打开文件的方法,一般用第二种

方法一:打开文件,传入到参数后,要关闭文件,否则其他用户将无法使用

>>> f.close()>>> f = open("/home/kate/txt/1.txt")>>> data = f.read()>>> f.close()>>> print datarootbindaemon

方法二:这种方法打开文件,可以避免忘记关闭文件的风险

>>> with open("/home/kate/txt/2.txt") as g:...   data = g.read()...   print data... root#bin#daemon#adm#

3.时间模块

把五天之后的时间,按照格式输出

>>> import datetime>>> today = datetime.date.today()>>> fiveday = datetime.timedelta(days=5)>>> for_fiveday = today - fiveday>>> after_fiveday = today + fiveday>>> print for_fiveday ,today ,after_fiveday2017-02-11 2017-02-16 2017-02-21>>>

4.fnmatch ,glob  //文件名匹配

>>> import glob>>> print glob.glob("*.txt")  //在当前目录中查找文件是.tx结尾的文件[]>>> print glob.glob("*.py")['random123.py', '99plus.py', 'backup.py']>>> print glob.glob("*.sh")['myecho7.sh', 'if01.sh', 'test1.sh', 'random.sh', 'myecho1.sh', 'passwd+8.sh', 'shengxiao2.sh', 'shengxiao3.sh', 'case1.sh', 'backup.sh', 'test02.sh', '99plus.sh', 'sort_max.sh', 'myecho3.sh', 'if02.sh', 'dict.sh', 'shengxiao1.sh', 'myecho6.sh', 'filelock1.sh', 'myecho5.sh', 'tom.sh', 'filelock2.sh', 'find_max.sh', 'random+0213.sh', 'myecho4.sh']>>> print glob.glob("????.sh")  //查找以.sh结尾,前面是四位数的文件['if01.sh', 'if02.sh', 'dict.sh']>>> 

os.walk 在指定的目录里递归遍历出指定的文件。是一个生成器,需要遍历出来。

#!/usr/bin/env python  2 #coding:utf8  3 #fnmatch函数的用法  4   5 import os  6 import fnmatch  7   8 rm_files = []  9  10 for root,dirs,files in os.walk("."): 11   for filename in fnmatch.filter(files,"*.pyc"): 12     rm_files.append(os.path.join(root,filename)) 13  14 print rm_files 15  16 #for i in rm_files: 17 # os.remove(i) 18  19 map(os.remove,rm_files) //map的作用很强大,第一个参数是命令,后面跟参数~                                                 

5.sys.argv 参数的传递

6.选项生成器optparse

 

[kate@up12 python]$ cat opt.py #!/usr/bin/env python#coding: utf8#选项生成器optparse#from optparse import OptionParserparser = OptionParser()parser.add_option("-f","--file",dest="filename",help="write report to FILE",metavar="FILE2")parser.add_option("-q","--quiet",action="store_false",dest="verbose",default=True,help="don't print status messages to stdout")parser.add_option("-v","--version")parser.add_option("-s","--src",metavar="FILE",help="src file path")#metavar 只是一个占位符而已,为了打印出来好看options,args = parser.parse_args()print optionsprint options.filenameprint options.srcprint options.verboseprint options.versionprint '--------------------'print args[kate@up12 python]$ ./opt.py  -f /etc/passwd -v -s -q{'src': None, 'version': '-s', 'verbose': False, 'filename': '/etc/passwd'}/etc/passwdNoneFalse-s--------------------[][kate@up12 python]$ 

backup

  1 #!/usr/bin/env python  2 # coding: utf8  3 #  4 # backup /etc/shadow to /tmp  5 # file read write append -> with  6 # tempfile  7 #  8   9 from optparse import OptionParser 10  11 import os 12 import sys 13 import commands 14 import shutil 15  16 if os.geteuid() != 0: 17     print "请使用超级用户运行!" 18     sys.exit(1) 19  20 op = OptionParser() 21 op.add_option("-s", "--src", help="src file path", metavar="FILE") 22 op.add_option("-d", "--dst", help="dst dir path", metavar="DIR") 23  24 options, args = op.parse_args() 25  26 srcfile = options.src 27 dstdir = options.dst 28  29 if not srcfile or not dstdir: 30     op.print_help() 31     sys.exit(3) 32  33 if not os.path.exists(srcfile): 34     print "%s 文件不存在" % srcfile 35     sys.exit(2) 36  37 #status, output = commands.getstatusoutput("cp %s /tmp/" % srcfile)38  39 #if  status != 0: 40 #    print "备份失败: %s" % output 41 #    sys.exit(3) 42 # 43 #print "备份成功" 44  45 #try: 46 #    shutil.copytree(srcfile, "/tmp/") 47 #    print "备份成功" 48 #except: 49 #    print "备份失败" 50 dstdir_name = os.path.basename(srcfile.rstrip("/")) 51  52 if os.path.isfile(srcfile): 53     shutil.copy2(srcfile, dstdir) 54 elif os.path.isdir(srcfile): 55     shutil.copytree(srcfile, os.path.join(dstdir, dstdir_name), symlinks=True) 56 else: 57     print "不支持备份这种文件!" 58     sys.exit(4) 59  60 print "备份成功"

 

7.用python写一个echo程序。

    我们把打印次数和打印行的功能写到一个程序里,颜色的显示我们写到另一个程序中,再进行调用

[kate@up12 python]$ ./myecho.py -c 6 --color red -n hello world(1, 'hello world')(2, 'hello world')(3, 'hello world')(4, 'hello world')(5, 'hello world')(6, 'hello world')[kate@up12 python]$ cat myecho.py #!/usr/bin/env python#coding: utf8#myecho [-h|--help] [--color {red|green|yellow}] [-c|--count NUM] [-n] string...#from optparse import OptionParserop = OptionParser()colors =["red","green","yellow"]op.add_option("--color",choices=colors,help="text color: %s " % "|".join(colors))op.add_option("-c","--count" ,type=int,help="print count", metavar="NUM",default=1)op.add_option("-n",dest="line",help="line number",action="store_true",default=False)options, args = op.parse_args()#print optionsfor i in range(1,options.count+1):  if options.line:    print(i," ".join(args))  else:    print(" ".join(args))[kate@up12 python]$ 

显示颜色的程序

 1 #!/usr/bin/env python  2 #coding: utf8  3 #myecho程序中的颜色显示程序  4 #  5   6 from __future__ import print_function  7   8 def cprint(*args,**kwargs):  9   colors = ["red","green","yellow"] 10   color = kwargs.get("color") 11   if color is None: 12     print(" ".join([ str(i) for i in args])) 13 #如果没有指定颜色,我们就直接输出字符 14     return 15  16   if color not in colors: 17     raise ValueError,"color must in:%s " % "|".join(colors) 18  19   if color == "red": 20     print("/033[31m",end="") 21 #这里end以空结束,表示不换行 22     print(" ".join([ str(i) for i in args ])) 23   elif color == "green": 24     print("/033[032m",end="") 25     print(" ".join([ str(i) for i in args ])) 26   elif color == "yellow": 27     print("/033[033m",end="") 28     print(" ".join( [ str(i) for i in args ])) 29  30   print("/033[0m",end="") 31  32 if __name__ == "__main__": 33   cprint("Hello,world") 34   cprint("hello") 35   cprint("world") 36   cprint("hello","world",11,22,33) 37   cprint("hello","world",11,22,33,color="red") 38   cprint("green","hello","world",11,22,33) 39   import sys 40   cprint(*sys.argv[1:]) 41   cprint(*sys.argv[1:],color="red") 42   cprint(*sys.argv[1:],color="green") 43   cprint(*sys.argv[1:],color="yellow")                                                                        

pcolor 程序的运行结果

 

现在我们将颜色的程序import到我们的echo程序中

  1 #!/usr/bin/env python  2 #coding: utf8  3 #myecho [-h|--help] [--color {red|green|yellow}] [-c|--count NUM] [-n] string...  4 #  5   6 from optparse import OptionParser  7 import pcolor  8   9 op = OptionParser() 10  11 colors =["red","green","yellow"] 12  13 op.add_option("--color",choices=colors,help="text color: %s " % "|".join(colors)) 14 op.add_option("-c","--count" ,type=int,help="print count", metavar="NUM",default=1) 15 op.add_option("-n",dest="line",help="line number",action="store_true",default=False) 16  17  18 options, args = op.parse_args() 19  20 #print options 21  22 for i in range(1,options.count+1):  //将i行号从1开始定义 23   if options.line: 24     pcolor.cprint(i," ".join(args), color=options.color) 25   else: 26     pcolor.cprint(" ".join(args), color=options.color)

 

运行结果:

 

我们还可以将我们的两个程序合并为一个程序

#!/usr/bin/env python  2 #coding: utf8  3 #myecho [-h|--help] [--color {red|green|yellow}] [-c|--count NUM] [-n] string....  4 #  5   6 from __future__ import print_function  7 from optparse import OptionParser  8   9 def cprint(*args,**kwargs): 10   colors = ["red","green","yellow"] 11   color = kwargs.get("color") 12   if color is None: 13     print(" ".join([ str(i) for i in args ])) 14     return 15   16   if color not in colors: 17     raise ValusError,"color must in :%s" % "|".join(colors) 18  19   if color == "red": 20     print("/033[31m", end="") 21     print(" ".join([ str(i) for i in args ])) 22   elif color == "green": 23     print("/033[32m",end="") 24     print(" ".join([ str(i) for i in args ])) 25   elif color == "yellow": 26     print("/033[33m",end="") 27     print(" ".join([ str(i) for i in args ])) 28  29   print("/033[0m",end="") 30  31 op = OptionParser() 32  33 colors = ["red","green","yellow"] 34  35 op.add_option("--color",choices=colors,help="text color:%s" % "|".join(colors)) 36 op.add_option("-c","--count",type=int,help="print count",metavar="NUM",default=1) 37 op.add_option("-n",dest="line",help="line number",action="store_true",default=False) 38  39 options,args = op.parse_args() 40  41 for i in range(1,options.count+1): 42   if options.line: 43     cprint(i," ".join(args),color=options.color) 44   else: 45     cprint(" ".join(args),color=options.color)

运行结果

除了用OptionParser可以格式化我们的选项外,我们同样可以使用第三方模块click来处理我们的格式化

from pcolor import cprintimport [email protected]()@click.option("-c","--count",type=int,help="print count",metavar="NUM",default=1)@click.option("-n",is_flag=True,help="print line num")@click.option("--color",type=click.Choice(["red","green","yellow"]),help="print color")@click.argument('mystrings',nargs=-1)// arguments是指定定长的参数,功能没有option强大。nargs=-1 表明参数 mystrings接收不定量的参数值,参数值会以 tuple 的形式传入函数。如果 nargs 大于等于 1,表示接收 nargs 个参数值def echo(*args,**kwargs):    color = kwargs.get("color")    count = kwargs.get("count")    line = kwargs.get("n")    mystrings = kwargs.get("mystrings")    for i in range(1,count+1):        if line:            cprint(i," ".join(mystrings),color = color)        else:            cprint(" ".join(mystrings),color = color)if __name__ == "__main__":    echo( )

我们也可以像上面一样,将显示颜色的功能函数添加进来,这次我们用click自带的函数click.secho() 可以显示颜色。

例:

import [email protected]()@click.option('--name', help='The person to greet.')def hello(name):    click.secho('Hello %s!' % name, fg='red', underline=True)    click.secho('Hello %s!' % name, fg='yellow', bg='black')if __name__ == '__main__':    hello()

其中:

  • fg 表示前景颜色(即字体颜色),可选值有:BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE 等;
  • bg 表示背景颜色,可选值有:BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE 等;
  • underline 表示下划线,可选的样式还有:dim=Truebold=True 等;

 

# coding: utf8__author__ = 'MAX'import clickcolors = ["red","green","yellow","blue","magenta"]@click.command()@click.option("-c","--count",type=int,help="print count ",metavar="NUM",default=1)@click.option("-n",is_flag=True,help="print line num")@click.option("--color",type=click.Choice(["red","green","yellow","blue","magenta"]),help="choice your favorite color %s " % "|".join(colors))@click.argument('mystrings',nargs=-1)def echo(*args,**kwargs):    color = kwargs.get("color")    count = kwargs.get("count")    line = kwargs.get("n")    mystrings = kwargs.get("mystrings")    for i in range(1,count+1):        if line:            click.secho(i," ".join(mystrings),fg=color)        else:            click.secho(" ".join(mystrings),fg=color)if __name__ == "__main__":    echo()

 

 

 

 

8.用python写一个grep的软件,需要用到re 

re的一些方法,groups查看分组

match必须从开头开始写正则表达式

我们自己来动手写一个grep功能的程序

#!/usr/bin/env python#gerp.py 'regex' filepathimport reimport sysif len(sys.argv) != 3:  print "Usage:%s  'regex' filepath" % sys.argv[0]  sys.exit(1)pattern = sys.argv[1]filepath = sys.argv[2]myre = re.compile(pattern)with open(filepath) as f:  for line in f:    if myre.search(line):#   if re.search(pattern,line): //这种匹配方法,每打印一句都会去进行匹配一次,效率太低,我们将不会采用这种方法      print line

 

 

 

我们自己写的grep程序,运行脚本时,前面写要匹配的字段,后面跟上文件夹就可以,匹配我们想要匹配字段的所在行了,在打印行的时候,不加“,”会默认输出换行符,我们家上“,”后就不会输出换行符了

性能最好的是grep>sed>python>awk

 

9.awk

#!/usr/bin/env python#coding: utf8#打印/etc/passwd 文件中,uid大于500的用户with open("/etc/passwd") as f:  for line in f:    data = line.split(":")    if int(data[2]) > 500:      print data[0],data[6]

 

 

我们可以自己指定文件,和指定分隔符,以及要显示的列,将awk的功能更加完善

#!/usr/bin/env python# coding: utf8from optparse import OptionParserop = OptionParser()op.add_option("-F",dest="sep",help="指定分隔符")op.add_option("-f",dest="fn",help="指定列号,eg:3 or 1,7",default="0")options,args = op.parse_args()if len(args) !=1:  op.print_help()  exit(1)with open(args[0]) as f:  for line in f:    data = line.split(options.sep)    if options.fn == 0:      print line,    else:      fn = options.fn.split(",")      for n in fn:        print data[int(n)-1].rstrip("/n"),      print

 

 

10.在python中用envoy模块运行shell命令,因为这个模块比较好用

 

广告 广告

评论区