打开文件
open
open(name[, mode[, buffering]])
- name : 一个包含了你要访问的文件名称的字符串值。
- mode : mode 决定了打开文件的模式,默认为r。
- buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
-
文件对象方法
- f.close() :关闭文件
- file.read([size]):从文件读取size个字符,当未给定size或给定负值时,读取剩余的所有字符,然后作为字符串返回,f.read()读到文件尾时返回""(空字串)
- file.readline():以写入模式打开,若文件存在,则在末尾追加写入。
- f.write(str):如果要写入字符串以外的数据,先将其转换为字符串。
- f.seek(偏移量offset,[起始位置from]):用来移动文件指针。从from(0代表文件起始位置,1代表当前位置,2代表文件末尾),偏移offset个字节。
- f.writelines(seq):向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象。
- f.tell():返回当前在文件的位置
-
pickle模块
为了让用户在平常的编程和测试时保存复杂的数据类型,python提供了标准模块,称为pickle.
这个模块可以将几乎任何的python对象(甚至是python的代码),转换为字符串表示,这个过程称为pickling.
而要从里面重新构造回原来的对象,则称为unpickling.
在pickling和unpicking之间,表示这些对象的字符串表示,可以存于一个文件,也可以通过网络远程机器间传输。
如果你有一个对象friend,和一个已经打开并用于写的文件对象f,pickle这个对象最简单的方式就是使用:
pickle.dunmp(friend,f)
# Pickle模块读入任何Python对象,将它们转换成字符串,
然后使用dump函数将其转储到一个文件中——这个过程叫做pickling。
迭代打印文件对象的每一行数据:
for each in f:
print(each)
-
Exception 异常
异常检测
- try-except语句
try:
检测范围
except Exception [as reason(变量] : #可同时写多个异常)
出现异常(Exception)后的处理代码
eg:print(‘错误原因’+str(reason)) - try-finally语句
try:
检测范围
except Exception [as reason]:
出现异常(Exception)后的处理代码
finally:
无论如何都会被执行的代码
eg:f.close() (关闭文件)
-
raise语句
当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。
try:
s = None
if s is None:
print('s 是空对象')
raise NameError
print len(s)
exception TypeError:
print('空对象没有长度')
-
else语句
- 与if配合使用
- while,for(若无break,else会执行)
- 异常处理搭配,若无出现异常,会执行else语句内容
-
with语句
对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源(会自动关闭文件)
-
EasyGui
导入EasyGui
import easygui #使用EasyGui函数时,必须在函数的前面加上前缀
easygui:
easygui.msgbox(...)
2.导入整个EasyGui包:
from easygui import *
easygui.msgbox(...) #直接编写代码
import easygui as g:
g.msgbox(...)
使用EasyGui,建议不要在IDLE上运行,可能会发生冲突
-
对象 = 属性 + 方法
属性:静态(特征等)
方法:动态(一个个函数)
-
python中类的命名约定为以大写字母开头
eg:
class One:
-
面向对象(oo) = Object Oriented
面向对象编程(oop)
面向对象 特征:封装、继承、多态
封装:信息隐蔽技术
继承:子类自动共享父类之间数据的方法和机制
多态:不同对象对同名方法响应不同的行动
继承:
>>>class Mylist(list):
pass
>>>list2 = Mylist()
>>>list2.append(5)
>>>list2.append(3)
>>>list2.append(7)
>>>list2
>>>[5,3,7]
>>>list2.sort()
>>>[3,5,7] #Mylist这个类继承了list方法
多态:
>>>class A:
def fun(self):
print('A')
>>>class B:
def fun(self):
print('B')
>>>a = A()
>>>b = B()
>>>a.fun()
>>>A
>>>b.fun()
>>>B #a,b调用同名的方法,但实现不一样,体现多态
-
self
self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
每个实例对象都有唯一的self参数
- self在定义时需要定义,但是在调用时会自动传入。
- self的名字并不是规定死的,但是最好还是按照约定是用self
- self总是指调用时的类的实例。
理解:同一类中,创造多个函数,self分别命名每个函数,实现不同效果
-
__ init__ (self)
class Word:
def __init__(self,name):
self.name = name
def kick(self):
print('是%s' % self.name)
>>>b = Word('单词')
>>>b.kick()
>>>是单词
-
公有、私有属性
属性和方法公有
>>>class Num:
name = 'one'
>>>p = Num()
>>>p.name
>>>one
私有属性:
python并没有真正的私有属性
用__定义的属性,只是被改名换姓而已
用_定义的属性,意义在于唤起用户的注意,看成私有属性
>>>class Num:
__name = 'one'
>>>p.Num()
>>>p.__name
>>>p.name #会报错
改为:
class Num:
__name = 'one'
def getName(self):
return self.__name
>>>p.getName()
>>>one
>>>p._Num__name #_类名__变量名
>>>one
-
继承
若子类与父类同名,会覆盖子类里父类的方法,子类对象调用的时候调用到覆盖后的新属性或方法,但对父类不受影响
class DerivedClassName子类(BaseClassName父类)
class Parent:
def hello(self):
print('正在调用父类方法')
class Child(Parent):
pass
>>>p = Parent()
>>>p.hello
>>>正在调用父类方法
>>>c = Child()
>>>c.hello()
>>>正在调用父类方法
-
super()
不需要明确给出任何基类的名字,它会自动帮你找出所有基类以及对应的方法。由于你不用给出基类的名字,这就意味着你如果需要改变类继承关系,你只需要改变class语句里的父类即可,而不必在大量代码中去修改所有被继承的方法。
-
多重继承
class DerivedClassName(Base1,Base2,Base3): #Base:多个父类名
class Base1:
def fo1(self):
print('1')
class Base2:
def fo2(self):
print('2')
class C(Base1,Base2)
pass
>>>c = C()
>>>c.fo1()
>>>1
>>>c.fo2()
>>>2
#缺点:易导致代码混乱
-
类相关的BIF
issubclass(class,classinfo)
isinstance(object,classinfo)
-
访问对象属性
- hasattr(object,name) #attr =attribute 属性
- getattr(object,name[,default])
- setattr(object,name,value)
- delattr(object,name)
-
property(fget = None,fset =None,Fdel = None,doc=None )
通过属性设置属性
- fget – 获取属性值的函数
- fset – 设置属性值的函数
- fdel – 删除属性值函数
- doc – 属性描述信息