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 data
root
bin
daemon
方法二:这种方法打开文件,可以避免忘记关闭文件的风险
>>> 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_fiveday
2017-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 OptionParser
parser = 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 options
print options.filename
print options.src
print options.verbose
print options.version
print '--------------------'
print args
[kate@up12 python]$ ./opt.py -f /etc/passwd -v -s -q
{'src': None, 'version': '-s', 'verbose': False, 'filename': '/etc/passwd'}
/etc/passwd
None
False
-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 OptionParser
op = 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 options
for 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 cprint
import click
@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"]),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 click
@click.command()
@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 click
colors = ["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' filepath
import re
import sys
if 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: utf8
from optparse import OptionParser
op = 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命令,因为这个模块比较好用