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=True
,bold=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命令,因为这个模块比较好用