本文是黑马Python4.0编程学习笔记,里面有相关的知识点还是重要的,期待大家的关注!!!
面向对象编程首先要设计类
类的三个要素
设计一个小猫类
class 类名:
def 方法名(self, 参数1, 参数2, ......):
pass
class cat:
def eat(self):
print("猫吃饭")
def drink(self):
print("猫喝水")
对象名 = 类名(参数列表)
# 对象创建后通过对象名.方法名(参数),调用方法
对象名.方法1()
class cat: # 定义了一个类cat,这个类不能直接使用
def eat(self): # 第一个参数必须是self
print("猫吃饭")
def drink(self):
print("猫喝水")
c1 = cat() # 根据类cat, 创建了一个对象c1, 对象名类似于变量名
c1.eat() # 调用的时候,不需要提供self对应的实参
c1.drink() # 调用对象的方法
# 方法只能通过对象调用,不能通过类直接调用
# c1就是类cat的实例
# c1 = cat() 这个动作就叫实例化
c2 = cat() # 实例化, 实例化的结果是cat类有一个对象叫c2
# c2是类cat的实例
class cat: # 定义了一个类cat,这个类不能直接使用
def set_name(self):
self.name = "tom" # 定义了一个属性,名叫name,值是tom
def eat(self): # 第一个参数必须是self
print("%s吃饭" % self.name) # 这里在使用name属性
def drink(self):
print("%s喝水" % self.name) # 这里在使用name属性
def demo(self): # 这个方法只是为了举例,在类的内部,方法嵌套调用
self.eat()
self.drink()
c = cat()
c.set_name()
c.drink()
c.eat()
c.name = "张三"
c.drink()
c.eat()
c.demo()
class dog:
def set_name(self, name):
self.name = name
def show_name(self):
print(self.name)
d = dog()
d.set_name("旺财")
d.show_name()
__init__注意名字,前面两个下划线,后面两个下划线class cat:
def __init__(self):
print("cat被创建了")
def eat(self):
print("小猫爱吃鱼")
c = cat() # 实例化对象的时候,init方法自动调用
c.eat() # 必须明确的通过代码调用普通方法
# class cat: # 不在普通方法中定义属性
# def set_name(self, name):
# self.name = name
# def show_name(self):
# print(self.name)
class cat:
def __init__(self, name = "tom"):
self.name = name
def set_name(self, name):
self.name = name
def show_name(self):
print(self.name)
c = cat("张三") # init自动已经调用了,所以name属性已经有了
c.show_name()
class cat:
def __init__(self, name):
pass
c = cat("tom") # 如果init有形参,那么实例化对象的时候,必须提供实参
class cat:
def __init__(self, name = "tom", color = "red"):
self.name = name
self.color = color
def show_name(self):
print(self.name)
def show_color(self):
print(self.color)
def show(self):
self.show_name()
self.show_color()
c1 = cat("小猫", "white")
c1.show_name()
c1.show_color()
c2 = cat("大猫", "black")
c2.show_name()
c2.show_color()
c3 = cat()
c4 = cat("懒猫")
# 汽车car 要区分属性和方法,在init方法中为每个属性定义默认值
# 属性
# luntai(轮胎)
# yanse(颜色)
# chuanghu(窗户)
# xinghao(型号)
# 方法
# guadang(挂挡)
# qianjin(前进)
# houtui(后退)
# wurenjiashi(无人驾驶)
# shache(刹车)
# jiayou(加油)
class car:
def __init__(self, luntai="轮胎", yanse="白色", chuanghu="黑窗户", xinghao="大众"):
self.luntai = luntai
self.yanse = yanse
self.chuanghu = chuanghu
self.xinghao = xinghao
def guadang(self, a = "前进"):
self.jiayou()
if a == "前进":
self.qianjin()
elif a == "后退":
self.houtui()
else:
print("档不对")
def qianjin(self):
print("%s在前进" % self.xinghao)
def houtui(self):
print("%s在后退" % self.xinghao)
def wurenjiashi(self):
print("无人驾驶")
def shache(self):
print("刹车")
def jiayou(self):
print("加油")
c = car()
# c.qianjin()
c.guadang("前进")
c1 = car(xinghao="奔驰")
c1.guadang("后退")
class cat:
def __init__(self, name = "tom"):
self.name = name
def show_name(self):
print(self.name)
def __del__(self):
print("%s销毁了" % self.name)
c = cat() # c是个对象,同时也是一个变量
c.show_name() # 这里显示了tom
如果对象是局部的,那么函数执行完毕,自动调用对象的del方法
如果对象是全局的,那么程序执行完毕,自动调用对象的del方法
class cat:
def __init__(self, name = "tom"):
self.name = name
def show_name(self):
print(self.name)
def __del__(self):
print("%s销毁了" % self.name)
def my_test1():
c1 = cat("小猫")
c1.show_name()
my_test1() # 程序的第一条执行语句
c = cat() # c是个对象,同时也是一个变量
c.show_name() # 这里显示了tom
__init__不要写成__int__
__del__对象在内存中销毁的时候自动调用del
设计方法的惯例
class cat:
def __init__(self, name = "tom"):
self.name = name
# 不想写show_name方法, 只是想把name返回给调用者
def get_name(self): # 设计方法管理,得到属性值get_属性名
return self.name
def set_name(self, name): # set_属性名(self, 形参)
self.name = name
def show_name(self): # 在方法中显示属性的值一般show_属性名
print(self.name)
c = cat()
print(c.get_name())
print(c.show_name()) # 没有return语句的方法或者函数,不要放到print
c1 = cat("小猫")
c1.set_name("加菲猫")
print(c1.get_name())
# 有一个dog类,有属性name和age
# 提供设置,得到,显示name和age属性的方法
class dog:
def __init__(self, name = '二哈', age = 2):
self.name = name
self.age = age
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
def show_name(self):
print(self.name)
def set_age(self, age):
self.age = age
def get_age(self):
return self.age
def show_age(self):
print(self.age)
d = dog("比熊", 3) # 实例化的时候设置属性的值
print(d.get_name())
d.set_name("黑背") # 实例化以后再设置属性值
print(d.get_name())
d.show_name()
__str__
class cat:
def __init__(self):
pass
c = cat()
print(c) # 当把对象直接放到print里面,实现的是对象在内存的地址编号
# 有时候,我们希望print能显示我们想显示的内容
# 假设,自己设计一个对象,放到print里面,显示对象的name属性值
class demo:
def __init__(self, name = "demo"):
self.name = name
def __str__(self):
return self.name
d = demo()
print(d)
class dog:
def __str__(self):
return "这是一个小狗类对象"
d = dog()
print(d)
class calc:
def __init__(self, oper = "+"):
self.oper = oper
def calc(self, a, b):
if self.oper == "+":
return a + b
elif self.oper == "-":
return a - b
elif self.oper == "*":
return a * b
elif self.oper == "/":
if b != 0:
return a / b
else:
return None
else:
return None
c = calc()
print(c.calc(3, 4))
d = calc("*")
print(d.calc(3, 4))
e = calc("/")
print(e.calc(3, 0))
f = calc("sdfsd")
print(f.calc(4, 5))
class woman:
def __init__(self):
self.name = "玛丽"
self.__weight = 200 # __weigth是一个私有属性
def __eat(self): # __eat方法为私有方法
print("吃的很多")
w = woman()
print(w.name)
# print(w.__weight) 不能在类的外部访问类的私有属性
# w.__eat() 不能在类的外部调用私有方法
class user:
def __init__(self):
self.name = "tom"
self.__passwd = "123456"
def show_name(self):
print(self.name)
def __show_passwd(self):
print(self.__passwd)
u = user()
u.show_name()
# u.__show_passwd() 类的外部不能访问类的私有属性和方法
class A:
pass
class B(A): # B继承自类A
pass
class animal:
def sleep(self):
print("睡")
def eat(self):
print("吃")
class dog(animal): # 类dog继承自animal类
def run(self):
print("跑")
d = dog() # dog会拥有animal所有属性和方法
d.sleep()
d.eat()
d.run()
子类—派生类
父类—基类
继承—派生
一个父类可以有多个子类继承,每个子类可以有自己特有的方法和属性
class animal:
def sleep(self):
print("睡")
def eat(self):
print("吃")
class dog(animal):
def run(self):
print("跑")
class fish(animal):
def swimming(self):
print("游泳")
class bird(animal):
def fly(self):
print("飞")
针对animal类,dog,fish和bird类是说明
class animal:
def sleep(self):
print("睡")
def eat(self):
print("吃")
class dog(animal):
def run(self):
print("跑")
class erha(dog):
def kawayi(self):
print("萌")
e = erha()
e.sleep()
e.eat()
e.run()
e.kawayi()
class animal:
def sleep(self):
print("睡")
def eat(self):
print("吃")
class dog(animal):
def run(self):
print("跑")
class fish(animal):
def swimming(self):
print("游泳")
class erha(dog):
def kawayi(self):
print("萌")
class cangao(dog):
def yaoren(self):
print("咬人")
class shark(fish):
def chiren(self):
print("吃人")
s = shark()
s.sleep()
s.eat()
s.swimming()
s.chiren()
c = cangao()
c.sleep()
c.eat()
c.run()
c.yaoren()
class animal:
def sleep(self):
print("睡")
def eat(self):
print("吃")
class dog(animal):
def eat(self): # 出现和父类同名方法,在子类dog中,就没有父类的eat方法了
print("吃肉")
d = dog()
d.sleep()
d.eat() # 由于覆盖了父类的eat方法,,所以这里调用的是dog类的eat方法
1.在子类中实现和父类同名方法
2.在子类的同名方法中用super().父类同名方法 来调用父类的方法
class animal:
def sleep(self):
print("睡")
def eat(self):
print("吃")
class dog(animal):
def sleep(self):
super().sleep() # 在子类方法中调用父类的sleep方法
print("睡得更多")
d = dog()
d.sleep() # 扩展了父类的sleep,所以既执行了父类的sleep,又增加了功能
class animal:
def sleep(self):
print("睡")
def __eat(self): # 私有成员不会被子类继承
print("吃")
class dog(animal): # 在dog类里面,没有__eat方法
pass
d = dog()
d.sleep()
# d.__eat() # 这里的代码会出错
class father:
def __init__(self):
self.__name = "张三"
self.house = "别墅"
def eat(self):
print("吃")
def sleep(self):
print("睡")
def __edu_back(self):
print("本科")
class son(father): # son拥有father所有的方法和属性
def show_eat(self):
self.eat() # eat是继承自father的,但也是son自己的
def show_sleep(self):
self.sleep()
def show_house(self):
print(self.house) # house是一个属性,不能调用,要用print
s = son()
s.show_eat()
s.show_sleep()
s.show_house()
# father有两个属性,三个方法
# son继承了father一个属性,两个方法
class animal:
def food(self):
pass
def eat(self):
self.food()
class dog(animal):
def food(self):
print("吃肉")
class cattle(animal):
def food(self):
print("吃草")
d = dog()
d.eat()
c = cattle()
c.eat()
class dog:
name = "二哈" # 如果在这个位置定义的变量,就是类属性
def __init__(self):
pass
print(dog.name) # 显示类属性的值
dog.name = "狼狗" # 修改类属性的值
print(dog.name)
class dog:
name = "二哈" # 如果在这个位置定义的变量,就是类属性
@classmethod
def set_name(cls, name):
cls.name = name # 通过类方法的形参修改类属性name值
def __init__(self):
self.age = 20 # 在类方法里面无法访问age
def demo(self): # 在类方法中无法调用demo
print("普通方法")
print(dog.name) # 显示类属性的值
dog.name = "狼狗" # 修改类属性的值
print(dog.name)
dog.set_name("比熊")
print(dog.name)
class dog:
name = "小白"
@classmethod
def get_name(cls):
return cls.name
def __init__(self):
self.age = 0
def get_age(self):
return self.age
# 要把类属性name的值修改为"小小白"
dog.name = "小小白"
# 调用类方法get_name,显示name的值
print(dog.get_name())
# 要把普通属性age的值修改为10
d = dog()
d.age = 10
# 调用普通方法get_age显示age的值
print(d.get_age())
class dog:
name = "小白"
@classmethod
def get_name(cls):
return cls.name
def demo(self): # 演示如何在普通方法中使用类属性和类方法
dog.name = "小小白"
print(dog.get_name())
d = dog()
d.demo()
class dog:
index = 0 # 定义了一个类属性
@classmethod
def count(cls): # 返回值为类属性index
return cls.index
def __init__(self): # 实例化的时候自动调用init
dog.index += 1 # 每次实例化的时候类属性index + 1
d1 = dog()
d2 = dog()
d3 = dog()
d4 = dog()
print(dog.count())
class dog:
@staticmethod
def help():
print("这是一个静态方法")
dog.help()
class dog:
@staticmethod
def help():
print("这是一个静态方法")
class A:
@staticmethod
def help():
print("这是第二个静态方法help")
dog.help()
A.help()
class animal: # 如果定义了一个类,没明确的写父类,那么父类就是object
def sleep(self):
print("睡")
# class animal(object):
# def sleep(self):
# print("睡")
a = animal()
# 文件操作步骤
打开文件
读取文件内容
关闭文件
# 第一步: 打开文件
file = open(r"C:\file\temp\a.txt", "r")
# 第二步:读取文件内容
txt = file.read()
print(txt) # 为了显示文件内容
# 第三步:关闭文件
file.close()
# 第一步:打开文件
file = open(r"c:\file\temp\b.txt", "w")
# 第二步:写内容
file.write("hello python")
# 第三步:关闭文件
file.close()
# 验证程序是否执行成功?看c盘file目录的temp目录下是否生成了文件b.txt
# b.txt文件内容是否为hello python
注意项:如果open第二个参数是"r",打开文件后只能用read读,不能用write写
如果open第二个参数是"w", 打开文件后只能用write写,不能用read读
file = open(r"c:\file\temp\c.txt", "a")
file.write("hello\n")
file.close()
UnicodeDecodeError:
file = open(r"C:\file\teach\05python\day09\3-code\01-open函数.py", "r", encoding="utf8")
txt = file.read()
print(txt)
file.close()
# 有文件a.txt
# 内容如下:
# 我爱你python, 我爱你
#
# 写代码,把a.txt内容中的python替换为world
#
# 思路,先把a.txt文件内用r方式读出来
# 用字符串的replace方法把python替换为world
# 在用w方式把替换后的内容写回到a.txt里面
file = open(r"c:\file\temp\a.txt", "r")
txt = file.read()
a = txt.replace("python", "world")
file.close() # 这一步必须关闭
file = open(r"c:\file\temp\a.txt", "w")
file.write(a)
file.close()
# 把文件a.txt复制为b.txt
# 思路:把a.txt打开,读取全部内容
# 把b.txt用w方法打开,把内容写入
file = open(r"c:\file\temp\a.txt", "r")
txt = file.read()
file.close()
file = open(r"c:\file\temp\b.txt", "w")
file.write(txt)
file.close()
# 有文件a.txt
# 内容如下:
#
# 我爱你python, 我爱你
#
# 有文件b.txt
# 内容如下:
#
# hello
#
# 把文件a.txt和b.txt合并为c.txt
# 思路:把文件a.txt内如读出来放到变量a
# 把文件b.txt内如读出来放到变量b
# 把a + b 结果写入的c.txt中
file = open(r"c:\file\temp\a.txt", "r")
a = file.read()
file.close()
file = open(r"c:\file\temp\b.txt", "r")
b = file.read()
file.close()
file = open(r"c:\file\temp\c.txt", "w")
file.write(a + b)
file.close()
file = open(r"c:\file\temp\a.txt", "r")
# 在循环开始的时候,不知道文件有多少行,所以也不能决定循环多少次
while True:
txt = file.readline()
# 如果readline读取到文件最后末尾,返回""
if txt == "":
break
print(txt, end="")
file.close()
# 有文件a.txt,有很多行,只显示偶数行
# 思路:只读方式打开a.txt,读取所有行,但只显示偶数行
# 做一个循环读取所有行,在循环的时候做一个计数器,每次循环计数器+1
# 可以判断计数器是偶数还是奇数,如果是偶数那么就print
file = open(r"c:\file\temp\a.txt", "r")
index = 1
while True:
txt = file.readline()
if txt == "":
break
if index % 2 == 0: # 如果条件成立,代表index为偶数
print(txt, end="")
index += 1
file.close()
file = open(r"c:\file\temp\a.txt", "r")
list1 = file.readlines()
for n in list1:
print(n, end="")
file.close()
# 有个文件a.txt,内容每一行是一个整数,最大值和最小值的差
# 思路:
# 把文件每一行 做为list的每个成员(文件的每一行是字符串)
# 只有max(list) - min (list)
#
# 先做一个空的list
# 循环读每行,把每行用int转化为整数,append到空的list里面
# 循环读完后,就可以max(list) - min(list)
file = open(r"c:\file\temp\a.txt", "r")
list1 = []
while True:
txt = file.readline()
if txt == "":
break
list1.append(int(txt))
file.close()
print(max(list1) - min(list1))
list1 = [2, 12, 5]
list2 = ['2', '12', '5']
print(max(list1), min(list1))
print(max(list2), min(list2))
# 如果长得像数字的字符串比较大小,比较原理是先比较字符串的一个字符
# file = open(r"c:\file\temp\a.txt", "r")
# txt = file.read()
# print(txt)
# file.close()
# 对等代码
with open(r"c:\file\temp\a.txt", "r") as file:
txt = file.read()
print(txt)
{
"name": "tom",
"age": 20,
"addr": [1, 2, 3]
}
import json
file = open("a.json", "r", encoding="utf8")
data = json.load(file) # 把json文件的内容转化为python的字典
file.close()
# print(data)
for n in data:
print(n, data[n])
json.decoder.JSONDecodeError
json文件的扩展名必须是.json
AttributeError: module 'json' has no attribute 'load'
import json
dict1 = {"name":"刘备", "age":20, "sex":"男"}
file = open("data.json", "w", encoding="utf8")
json.dump(dict1, file, ensure_ascii=False)
file.close()
# 思路:
# 先把内容从test.json文件中读出来
# 读出来的结果是一个字典
# 把字典中键age对应 的值修改为30
# 再把字典写回到test.json文件中
import json
file = open("test.json", "r", encoding="utf8")
dict1 = json.load(file)
file.close()
dict1["age"] = 30
file = open("test.json", "w", encoding="utf8")
json.dump(dict1, file, ensure_ascii=False)
file.close()
import unittest
def my_sum(a, b):
return a + b
class my_test(unittest.TestCase):
def test_001(self):
print(my_sum(5, 6))
def test_002(self):
print(my_sum(0, 3))
import unittest
import testcase_01
suite = unittest.TestSuite()
suite.addTest(testcase_01.my_test("test_001"))
suite.addTest(testcase_01.my_test("test_002"))
# 只是把测试用例添加到了测试套件中,并不是执行测试用例
import unittest
import testcase_01
suite = unittest.TestSuite()
# suite.addTest(testcase_01.my_test("test_001"))
# suite.addTest(testcase_01.my_test("test_002"))
# 只是把测试用例添加到了测试套件中,并不是执行测试用例
suite.addTest(unittest.makeSuite(testcase_01.my_test))
import unittest
import testcase_01
suite = unittest.TestSuite()
# suite.addTest(testcase_01.my_test("test_001"))
# suite.addTest(testcase_01.my_test("test_002"))
# 只是把测试用例添加到了测试套件中,并不是执行测试用例
suite.addTest(unittest.makeSuite(testcase_01.my_test))
runner = unittest.TextTestRunner() # 实例化TextTestRunner的对象
runner.run(suite) # 调用对象的run方法
import unittest
# 用TestLoader对象的discover方法来自动查找py,自动加载py文件中的方法
# 第一个参数是从哪里找py文件,"."从当前目录开始查找py文件
# 第二个参数是指定py文件的文件名,可以用通配符
suite = unittest.TestLoader().discover(".", "my*.py")
runner = unittest.TextTestRunner()
runner.run(suite)
mytest.py内容修改如下:
import unittest
def my_sum(a, b):
return a + b
class my_test(unittest.TestCase):
def setUp(self):
print("setup被自动调用了")
def tearDown(self):
print("teardown被自动调用了")
def test_001(self):
print(my_sum(5, 6))
def test_002(self):
print(my_sum(0, 3))
@classmethod def setUpClass(cls)类开始时自动调用的方法@clasmethod def tearDownClass(cls)类结束的时候自动调用的方法mytest.py修改如下:
import unittest
def my_sum(a, b):
return a + b
class my_test(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setupclass自动调用了")
@classmethod
def tearDownClass(cls):
print("teardownclass自动调用了")
def setUp(self):
print("setup被自动调用了")
def tearDown(self):
print("teardown被自动调用了")
def test_001(self):
print(my_sum(5, 6))
def test_002(self):
print(my_sum(0, 3))
修改后的mytest.py内容如下
import unittest
def setUpModule():
print("setUpModule自动调用了")
def tearDownModule():
print("tearDownModule自动调用了")
def my_sum(a, b):
return a + b
class my_test1(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setupclass自动调用了")
@classmethod
def tearDownClass(cls):
print("teardownclass自动调用了")
def setUp(self):
print("setup被自动调用了")
def tearDown(self):
print("teardown被自动调用了")
def test_001(self):
print(my_sum(5, 6))
def test_002(self):
print(my_sum(0, 3))
class my_test2(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setupclass自动调用了")
@classmethod
def tearDownClass(cls):
print("teardownclass自动调用了")
def setUp(self):
print("setup被自动调用了")
def tearDown(self):
print("teardown被自动调用了")
def test_001(self):
print(my_sum(5, 6))
def test_002(self):
print(my_sum(0, 3))
修改后的mytest.py内容
import unittest
def setUpModule():
print("setUpModule自动调用了")
def tearDownModule():
print("tearDownModule自动调用了")
def my_sum(a, b):
return a - b
class my_test1(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setupclass自动调用了")
@classmethod
def tearDownClass(cls):
print("teardownclass自动调用了")
def setUp(self):
print("setup被自动调用了")
def tearDown(self):
print("teardown被自动调用了")
def test_001(self):
num1 = my_sum(5, 6) # 定义变量num1得到my_sum函数的返回值
self.assertEqual(num1, 11) # num1里存放的是实际结果,11是预期结果
# 实际结果与预期结果相符,代表测试用例测试通过
# 不相符代表测试用例测试失败
def test_002(self):
num1 = my_sum(0, 3)
self.assertEqual(num1, 3)
修改后的mytest.py内容如下:
import unittest
import random
def setUpModule():
print("setUpModule自动调用了")
def tearDownModule():
print("tearDownModule自动调用了")
def my_sum(a, b):
return a + b
def my_rand(): # 返回从1到5之间的一个随机数
return random.randint(10, 50)
class my_test1(unittest.TestCase):
def test_001(self):
num1 = my_sum(5, 6) # 定义变量num1得到my_sum函数的返回值
self.assertEqual(num1, 11) # num1里存放的是实际结果,11是预期结果
# 实际结果与预期结果相符,代表测试用例测试通过
# 不相符代表测试用例测试失败
def test_002(self):
num1 = my_sum(0, 3)
self.assertEqual(num1, 3)
def test_003(self):
num1 = my_rand()
self.assertIn(num1, [1, 2, 3, 4, 5])
import unittest
import random
def setUpModule():
print("setUpModule自动调用了")
def tearDownModule():
print("tearDownModule自动调用了")
def my_sum(a, b):
return a + b
class my_test1(unittest.TestCase):
def test_001(self):
num1 = my_sum(5, 6) # 定义变量num1得到my_sum函数的返回值
self.assertEqual(num1, 11) # num1里存放的是实际结果,11是预期结果
# 实际结果与预期结果相符,代表测试用例测试通过
# 不相符代表测试用例测试失败
def test_002(self):
num1 = my_sum(0, 3)
self.assertEqual(num1, 3)
def test_003(self):
num1 = my_sum(-3, 7)
self.assertEqual(num1, 4)
def test_004(self):
num1 = my_sum(-4, -20)
self.assertEqual(num1, -24)
# 以上的测试用例,基本是一样的,测试用例的数据和预期结果不同
import unittest
from parameterized import parameterized
def my_sum(a, b):
return a + b
class my_test1(unittest.TestCase):
# a是调用my_sum的第一个参数
# b是调用my_sum的第二个参数
# c是预期结果
@parameterized.expand([(1, 2, 3), (5, 6, 110), (-1, 3, 2)])
def test_001(self, a, b, c):
num1 = my_sum(a, b) # 定义变量num1得到my_sum函数的返回值
self.assertEqual(num1, c) # num1里存放的是实际结果,11是预期结果
# 实际结果与预期结果相符,代表测试用例测试通过
# 不相符代表测试用例测试失败
执行结果
参数化场景二
import unittest
from parameterized import parameterized
def my_sum(a, b):
return a + b
list1 = [(1, 2, 3), (5, 6, 110), (-1, 3, 2)]
class my_test1(unittest.TestCase):
# a是调用my_sum的第一个参数
# b是调用my_sum的第二个参数
# c是预期结果
@parameterized.expand(list1)
def test_001(self, a, b, c):
num1 = my_sum(a, b) # 定义变量num1得到my_sum函数的返回值
self.assertEqual(num1, c) # num1里存放的是实际结果,11是预期结果
# 实际结果与预期结果相符,代表测试用例测试通过
# 不相符代表测试用例测试失败
参数化场景三:
import unittest
from parameterized import parameterized
def my_sum(a, b):
return a + b
def get_data(): # 定义了一个函数,返回一个列表
return [(1, 2, 3), (5, 6, 110), (-1, 3, 2)]
class my_test1(unittest.TestCase):
# a是调用my_sum的第一个参数
# b是调用my_sum的第二个参数
# c是预期结果
@parameterized.expand(get_data())
def test_001(self, a, b, c):
num1 = my_sum(a, b) # 定义变量num1得到my_sum函数的返回值
self.assertEqual(num1, c) # num1里存放的是实际结果,11是预期结果
# 实际结果与预期结果相符,代表测试用例测试通过
# 不相符代表测试用例测试失败
@unittest.skip
def 方法名():
import unittest
from parameterized import parameterized
def my_sum(a, b):
return a + b
def get_data(): # 定义了一个函数,返回一个列表
return [(1, 2, 3), (5, 6, 11), (-1, 3, 2)]
class my_test1(unittest.TestCase):
# a是调用my_sum的第一个参数
# b是调用my_sum的第二个参数
# c是预期结果
@parameterized.expand(get_data())
def test_001(self, a, b, c):
num1 = my_sum(a, b) # 定义变量num1得到my_sum函数的返回值
self.assertEqual(num1, c) # num1里存放的是实际结果,11是预期结果
# 实际结果与预期结果相符,代表测试用例测试通过
# 不相符代表测试用例测试失败
@unittest.skip
def test_002(self):
print("test002")
stream=file, verbosity=2
file代表用open打开的一个文件
verbosity=2,固定
import unittest
# 用TestLoader对象的discover方法来自动查找py,自动加载py文件中的方法
# 第一个参数是从哪里找py文件,"."从当前目录开始查找py文件
# 第二个参数是指定py文件的文件名,可以用通配符
suite = unittest.TestLoader().discover(".", "my*.py")
# runner = unittest.TextTestRunner()
file = open("test01.txt", "w", encoding="utf8")
runner = unittest.TextTestRunner(stream=file, verbosity=2)
runner.run(suite)
file.close()
import unittest
from HTMLTestRunner import HTMLTestRunner
# 用TestLoader对象的discover方法来自动查找py,自动加载py文件中的方法
# 第一个参数是从哪里找py文件,"."从当前目录开始查找py文件
# 第二个参数是指定py文件的文件名,可以用通配符
suite = unittest.TestLoader().discover(".", "my*.py")
# runner = unittest.TextTestRunner()
file = open("test01.html", "wb") # 用wb代表用二进制写方式打开文件
# runner = unittest.TextTestRunner(stream=file, verbosity=2)
runner = HTMLTestRunner(stream=file, title="我的第一个html测试报告")
runner.run(suite)
file.close()
try:
可能出现异常的语句
except:
出现异常后会自动执行的代码
如果try下面的代码没出现异常,那么except下面的代码不会执行
只有try下面的代码出现异常,except下面的代码才会执行
一旦异常被try捕捉,那么程序就不会报错终止了
try:
a = int(input("请输入一个整数"))
except:
print("输入不正确")
try:
可能出异常的代码
except 异常类型1:
出现异常类型执行的代码
except 异常类型2:
出现异常类型执行的代码
except:
出现未知异常执行的代码
try:
a = int(input("请输入一个整数"))
b = int(input("请输入一个整数"))
print(a / b)
except ValueError:
print("请输入一个可以转化整数")
except ZeroDivisionError:
print("除数不能为0")
except:
print("未知错误")
# ValueError: 输入的值不能转化为整数
# ZeroDivisionError: 除数为0的时候报的错误
try:
num1 = int(input("请输入num1的值"))
num2 = int(input("请输入num2的值"))
op1 = input("请输入op1的值")
if op1 == "+":
print(num1 + num2)
elif op1 == "-":
print(num1 - num2)
elif op1 == "*":
print(num1 * num2)
elif op1 == "/":
print(num1 / num2)
else:
print("op1值不对")
except ValueError:
print("请输入一个可以转化整数")
except ZeroDivisionError:
print("除数不能为0")
except:
print("未知错误")
try:
可能出现异常的代码
except:
发生异常要处理的代码
else:
没有异常发生要执行的代码
try:
a = int(input("请输入a的值"))
b = int(input("请输入b的值"))
print(a / b)
except:
print("异常发生")
else:
print("没有异常发生")
try:
a = int(input("请输入a的值"))
b = int(input("请输入b的值"))
print(a / b)
except Exception as result: # 捕捉未知异常,把未知异常系统的错误提示显示出来
print(result)
try:
可能出现异常的代码
except:
出现异常要处理的代码
finally:
无论是否异常都要执行的代码
try:
a = int(input("请输入a的值"))
b = int(input("请输入b的值"))
print(a / b)
except:
print("异常发生")
finally:
print("不论是否有异常都要执行的代码")
try:
可能出现异常的代码
except 指定异常类型1:
异常执行代码
except 指定异常类型2:
异常执行代码
except Exception as result:
异常执行代码
else:
没有异常执行代码
finally:
无论是否有异常执行代码
try:
a = int(input("请输入a的值"))
b = int(input("请输入b的值"))
print(a / b)
except ValueError:
print("请输入正确的整数")
except ZeroDivisionError:
print("除数不能为0")
except Exception as result:
print("未知异常", result)
else:
print("代码没有异常发生")
finally:
print("代码执行完成")
raise Exception("异常描述")
print("开始")
raise Exception("主动抛出的异常") # 这个异常是自己人为抛出
# 不论什么样的异常,只有不捕捉,代码就会报错终止
print("结束") # 这里的print执行不了,因为上面一句代码已经抛出异常了,程序终止了
# 计算器,当用户输入的不是+-*/会抛出异常,并捕捉这个异常
try:
num1 = int(input("请输入整数"))
num2 = int(input("请输入整数"))
op1 = input("请输入+-*/")
if op1 != "+" and op1 != "-" and op1 != "*" and op1 != "/":
raise Exception("请输入正确的+-*/")
if op1 == "+":
print(num1 + num2)
elif op1 == "-":
print(num1 - num2)
elif op1 == "*":
print(num1 * num2)
else:
print(num1 / num2)
except Exception as result:
print(result)
# 设计一个函数,如果参数str1中有数字返回true,否则返回false
def digital(str1):
for n in str1:
if n >= "0" and n <= "9":
return True
return False
try:
name = input("请输入姓名")
if digital(name): # 条件成立,抛出异常
raise Exception("名字不允许有数字")
age = int(input("请输入年龄"))
if age < 0:
raise Exception("年龄不能小于0")
except Exception as result:
print(result)
当一个函数返回一个布尔值,做为条件放到if或者while后面的时候
if 函数名 == True 等价 if 函数名 如果函数返回True,等于条件成立
如果返回返回False等于条件不成立
如果一个函数返回False,那么就执行if语句
if not 函数名 :
import
import 模块名
模块名.函数
# 在module2.py里面使用module1.py中定义的函数
import module1
print(module1.my_sum(3, 4))
module1.py
def my_sum(a, b):
return a + b
import 模块名 as 别名
别名.函数名
# 在module2.py里面使用module1.py中定义的函数
import module1 as m
print(m.my_sum(3, 4))
from 模块名 import 函数名
调用函数的时候,不需要前面在接模块名.,直接写函数名调用即可
from 模块名 import *
导入所有内容,使用内容的时候,不需要写模块名.
module1.py
def my_sum(a, b):
return a + b
def my_max(a, b):
if a > b:
return a
else:
return b
module3.py
# 只想导入module1中的my_max函数
from module1 import my_max
print(my_max(4, 5))
__name__属性__name____main__module4.py
def my_test():
print(__name__)
# my_test() 当前如果执行的就是module4这个模块,那么属性__name__的值为"__main__"
module5.py
import module4
module4.my_test() # 调用module4中的my_test函数
# 这里的my_test会输出module4
__init__.py文件a1.py
def my_max(a, b):
if a > b:
return a
else:
return b
a2.py
def my_sum(a, b):
return a + b
__init__.py文件__init__.py
from . import a1
from . import a2
module6.py
# module6要使用包my_back
import my_pack
print(my_pack.a1.my_max(3, 5))
print(my_pack.a2.my_sum(3, 5))
import 包名
包名.模块名.函数名
__init__.py文件中通过import导入模块才能使用__init__.py里面的from 后面是个相对路径from 包.模块 import 函数
直接写函数名调用函数即可
from my_pack.a1 import my_max
from my_pack.a2 import my_sum
print(my_max(4, 6))
print(my_sum(4, 6))
my_pack1/m1.py
def m1_func():
print("我是m1的func函数")
def m1_test():
print("我是m1的test函数")
my_pack1/m2.py
def m2_func():
print("我是m2的func函数")
my_pack1/__init__.pu
from . import m1
from . import m2
module8.py
# import my_pack1
# my_pack1.m1.m1_func()
# my_pack1.m1.m1_test()
# my_pack1.m2.m2_func()
from my_pack1.m1 import m1_test
from my_pack1.m1 import m1_func
from my_pack1.m2 import m2_func
m1_test()
m1_func()
m2_func()
今天这篇文章就到这里了,大厦之成,非一木之材也;大海之阔,非一流之归也。感谢大家观看本文
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务