关于设计模式(一)
设计模式是面向对象语言特有的内容,是我们在面临某一问题时固定的做法
class CarFactory:
def carName(self,name):
if name == "benchi":
return Benchi()
elif name == "BiYardi":
return BiYardi()
elif name == "BaoMa":
return BaoMa()
elif name == "FEi":
return FEi()
else: return "输入错误"
class Benchi:
pass
class BiYardi:
pass
class BaoMa:
pass
class FEi:
pass
a = CarFactory()
b=a.carName("BaoMa")
print(b)
#输出
<__main__.BaoMa object at 0x000002C53FBDFF10>
工厂和单例的整合
class CarFactory:
__obj=None
__init__flag=True
def carName(self,name):
if name == "benchi":
return Benchi()
elif name == "BiYardi":
return BiYardi()
elif name == "BaoMa":
return BaoMa()
elif name == "FEi":
return FEi()
else: return "输入错误"
def __new__(cls,*args, **kwargs):
if cls.__obj==None:
cls.__obj=object.__new__(cls)
return cls.__obj
def __init__(self):
if CarFactory.__init__flag:
print("int******")
CarFactory.__init__flag=False
class Benchi:
pass
class BiYardi:
pass
class BaoMa:
pass
class FEi:
pass
a = CarFactory()
b=a.carName("BaoMa")
c=a.carName("FEi")
print(b)
print(c)
int******
<__main__.BaoMa object at 0x00000211536CFE80>
<__main__.FEi object at 0x00000211536CFE50>
try__except 基本结构
print("step0")
try:
print("step1")
a=3/0
print(step2)
except BaseException as e:
print(e)
print(type(e))
print("stept3")
step0
step1
division by zero
<class 'ZeroDivisionError'>
stept3
while True:
try:
a = int(input("please input number"))
if a == 888:
print("end", a)
break
else:
print(a)
except BaseException as e:
print(e)
print("it is error,please re-enter")
print("it is ending")
常见异常:
SyntaxError: | 语法错误 |
NameError | 尝试访问一个没有申明的变量 |
ZeroDivisionError | 除数为0的错误 |
ValueError | 数值错误 |
TypeError | 类型错误 |
AttributeError | 访问对象不存在的属性 |
IndexError: | 索引越界异常 |
KeyError: | 字典的关键字不存在 |
ArithmeticError | 所有数值计算错误的基类 |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
BaseException | 所有异常的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
EnvionmentError | 操作系统错误的基类 |
EOFError | 没有内建输入 到达EOF标记 |
Exception | 常规错误的基类 |
trackback模块的使用 异常写入文件
try:
print("step0")
a=3/0
print(a)
except:
with open("文件地址","") as f:
traceback.print_exc(file=f)
自定义异常类
class AgeError(Exception):
def __init__(self,age):
Exception.__init__(self)
self.age=age
def __str__(self):
return str(self.age) + " input age is error"
if __name__=="__main__":
age = int(input("please input age:"))
if age<1 or age>150:
raise AgeError(age)
else:
print("normal age:",age)
Traceback (most recent call last):
File "D:\python\pc\01\try except.py", line 12, in <module>
raise AgeError(age)
__main__.AgeError: 999 input age is error
创建文件对象open()
open()函数用于创建文本对象 语法格式如下:
open(文件名[打开方式])
r 读模式
w 写模式 如果文件不存在则创建 文件存在 则重写新内容
a 追加模式 如果文件不存在则创建 文件存在,则在文件末尾追加内容
b 二进制模式 (可与其他模式组合使用)
+ 读、写模式(可与其他模式组合使用)
f = open("a.txt",a)
a = "feichanghao\n"
f.write(a)
f.close()
文件对象的常用方法
raed([size]) 从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件
读取到文件末尾,会返回空字符
readline()读取一行内容作为结果返回。读取到文件末尾,会返回空字符
readlines() 读取文件中,每一行作为一个字符串存入列表
write(str) 将字符串str内容写入文件
writelines(s) 将字符串列表s写入文件中,不添加换行字符
seek(offset[,whence]) 把文件指针移动到新的位置,offset表示相对于whence的多少个字节的偏移量;
offset:
off为正忘结束方向移动,为负方向开始方向移动
whence不同的值代表不同的含义:
0 从文件头开始计算(默认值)
1 从当前位置开始计算
2 从文件尾开始计算
tell() 返回文件指针的当前位置
truncate([size]) 不论指针在什么位置,只留下指针前size个字节的内容,其余全部删除;
如果没有传入size,则指针当前那位置到文件末尾内容全部删除
flush() 把缓冲区的内容写入文件,但不关闭文件
close() 把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源
with open("e.txt","r",encoding="utf-8") as f:
print("文件名:{0}".format(f.name))
print(f.tell())
print("读取的内容是:{0}".format(str(f.readline())))
print(f.tell())
f.seek(3) #中文在utf-8中占三个字节
print("读取的内容是:{0}".format(str(f.readline())))
文件名:e.txt
0
读取的内容是:我love study
15
读取的内容是:love study
enumerate()函数和推导式生成列表
a = ["I love program!\n","I love English!\n","I love study\n"]
b = enumerate(a)
print(a)
print(list(b))
#rstrip 用来去除\n字符 temp指列表中的元素
c = [temp.rstrip()+" #"+str(index) for index,temp in enumerate(a)]
print(c)
['I love program!\n', 'I love English!\n', 'I love study\n']
[(0, 'I love program!\n'), (1, 'I love English!\n'), (2, 'I love study\n')]
['I love program! #0', 'I love English! #1', 'I love study #2']
f=open(r"d:\a.txt",'wb') #可写的、重写模式的二进制文件对象
f=open(r"d:\a.txt",'ab') #可写的、追加模式的二进制文件对象
f=open(r"d:\a.txt",'rb') #可读的二进制文件对象