继续跨这个还没跨完的门
在前两篇中主要是针对面向过程的编程,这一篇作为python入门的终结篇,主要讨论一下面向对象的编程以及文件IO和异常处理
一、面向对象编程
- 1.类和对象
例如int x : 变量x是int类的一个对象,下面通过例子详细说明
#!/usr/bin/python2
class hello:
def num(self,a,b):
print a,b
i=555
p=hello()
p.num(1,3)
print p.i
定义了一个hello的类,其下有一个num的函数(类的方法)和一个i变量(类的域),p=hello()
创建了一个hello类的对象p,然后通过对象p调用类的方法和域,其中p.num(1,3)
和hello().num(1,3)
结果是一样的,域也类似
2.self变量
从上个代码中,可以看到类的方法和之前的函数定义有一个区别,就是必须有一个额外的变量(建议命名为self),这个变量指向对象本身,self是不需要赋值的
self变量的工作原理:当调用方法p.num(1,3)的时候,python自动转换为hello.num(p,1,3),这个self变量指向的是对象p3.__init__方法
__init__方法是在类的一个对象创立的时候,立即运行,即初始化
#!/usr/bin/python2
class hello:
def __init__(self,name):
self.str=name
def string(self):
print self.str
p=hello("hlf")
q=hello("flh")
p.string()
q.string()
上面代码,p和q都是hello类的对象,但是初始化的时候,将两个不同的字符串分别存储在p和q的str域中(名称自己定义),再调用string方法,将各自的str域的值打印出来。上面代码并没有调用__init__方法,而初始化的值已经自动传递了
- 4.类的变量
类的变量和对象的变量之间的关系,个人理解就像是全局变量和局部变量之间的关系,上个代码中的self.str就是对象的变量(就算这些对象是同一个类,但是他们的self.str也是私有的,不共享),那类的变量(则就是可以在同类的各个对象中,共享数据啦),还是以例子来说
#!/usr/bin/python2
class hello:
num=222
def get_num(self,i):
hello.num=i
p=hello()
q=hello()
print hello.num
q.get_num(111)
print hello.num
p.get_num(333)
print hello.num
创建了hello类的两个对象p和q,hello.num则就是类的变量了,该hello类的每个对象都可以对这个共享的值进行读写,代码的运行结果为:222
(初始值)、111
(对象q进行一次操作)、333
(对象p进行一次操作);相对的self.xxx就是对象的变量了,不共享
- 5.继承
依然先来一段代码
#!/usr/bin/python2
class hello:
i=222
def hi(self,i):
print "hello",i
class child(hello):
def child_num(self,num):
hello.hi(self,num)
self.ii=hello.i
p=child()
p.child_num(888)
print p.ii
输出结果为:
hello 888
222
可以看出child类调用(继承)了hello类中的方法和域,p虽是child类的对象,却可以使用hello中的方法和域,假如有一些新的子类child1、child2、child3等都需要父类中的方法和域,这样继承就可以将代码的重用性得到提升
二、文件IO
目前为止,接触到的交互途径就是raw_input
和print
,来进行字符串的输入输出,从而和机器交流,还有一种交流方式是通过文件输入输出来进行交互
- 先以一个简单的例子,迅速初步了解文件的使用
#!/usr/bin/python2
text = '''\
hello
hi
ni hao
'''
f = file('text.txt','w')
f.write(text)
f.close()
f = file('text.txt','a')
f.write("hhhhh")
f.close()
f = file('text.txt')
while True:
line = f.readline()
print line,
if len(line) == 0:
break
f.close()
text 中的内容,通过’w’模式,创建并写入在了text.txt文件中,通过close方法告诉python已完成了文件的调用,销毁f
‘a’模式,追加字符串到文件text.txt中
最后读出文件里面的内容,print后面的逗号是为了消除换行(因为readline和默认的print都是带换行的,就不好看了,so去掉一个),输出的结果自己想象
打开文件可以看到和输出的结果是一样的
- 将任何python对象存储在文件中
通过pickle模块实现存取,cPickle(c语言写的)功能与前者一样,但是速度比pickle快
#!/usr/bin/python2
import cPickle as p
num1 = [111, 222, [333,444,555]]
f = file("text.txt", 'w')
p.dump(num1,f)
f.close()
f = file("text.txt")
num2 = p.load(f)
for i in num2:
print i
结果也是显而易见的,至于文件的更深入就暂时不去了解了
三、异常与处理
- 异常的发生
#!/usr/bin/python2
s=raw_input("input:")
这样一句代码,是在等待键盘输入,但是如果运行的时候强行Ctr+D终止,看一下输出的结果:
root@hlf-virtual-machine:/home/hlf/mnt# ./main.py
input:Traceback (most recent call last):
File “./main.py”, line 2, in
s=raw_input(“input:”)
EOFError
在没有输入的情况下,强行终止,该代码抛出了一个EOFError异常
- 异常的处理
使用try…except语句,处理异常
将正常代码写入try中,当try中出现异常时,再运行相应的except
#!/usr/bin/python2
try:
s=raw_input("input:")
except:
print "\nstop"
现在重复上面的步骤,在没有输入的情况下,强行终止,可以看到输出结果变成了:
root@hlf-virtual-machine:/home/hlf/mnt# ./main.py
input:
stop
如果想精确的处理相应的异常,则可以将程序改为:
#!/usr/bin/python2
try:
s=raw_input("input:")
except EOFError:
print "\nstop"
except:
pass
except:
则是处理EOFError异常之外的异常
- 自己创建异常
准备自己创建一个empty的异常类,当输入的字符串为空的时候,抛出异常,并将自己输入的“yes”字符串传给异常的类,然后在except中打印
#!/usr/bin/python2
class empty(Exception):
def __init__(self,string):
Exception.__init__(self)
self.i=string
try:
s=raw_input("input:")
if s=="":
raise empty("yes")
except empty,e:
print "empty:%s"%e.i
except:
pass
代码创建了一个empty类,该类继承Exception类,并使用其初始化方法,与系统自己抛出的异常不同,我们要通过raise
才能将异常抛出去,然后在except中接住这个empty异常
- try…finally…语句
当异常发生时,往往需要做一些最终的工作,比如保护数据、关闭文件等操作,那么就需要try...finally
了,无论异常是否发生、是否处理,都会执行finally里的程序
#!/usr/bin/python2
try:
s=raw_input("input:")
except EOFError:
print "\nEOFError"
except:
print "\nerror"
finally:
print "finally"
输出结果:
1>Ctr+D终止程序,发生EOFError异常:
root@hlf-virtual-machine:/home/hlf/mnt# ./main.py
input:
EOFError
finally
2>Ctr+C终止Shell进程,发生异常:
root@hlf-virtual-machine:/home/hlf/mnt# ./main.py
input:^C
error
finally
3>不发生异常,正常运行:
root@hlf-virtual-machine:/home/hlf/mnt# ./main.py
input:hello
finally
python的入门到此也就结束了,到此处的时候,基本上已经可以独立编写一些小程序了,接下来,就是对python标准库模块和一些相关的类及函数、语句进行相应的了解和掌握了,结束就是新的开始