# 第九章 类
作为一个程序员,我根本不知道什么是
累
- 在python中定义一个类
class Class_Name():
- 初始化方法(构造方法):
def __init__(self)
- 实例化对象
obj=Class_Name(param)
- 类中的函数的
self
代表当前对象,且必须在函数参数的第一个
class SingleDog:
"""
单身狗
"""
def __init__(self, name, age):
"""
初始化方法,当实例化对象时会自动调用
:param name:
:param age:
"""
self.name = name
self.age = age
print("在创建对象的时候会调用这个初始化方法哟~")
def sit(self):
"""
坐下
:return:
"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""
命令打滚
:return:
"""
print(self.name.title() + " rolled over!")
# 实例化对象
single_dog = SingleDog("大东", 66)
# 调用方法
single_dog.sit()
single_dog.roll_over()
# 访问属性
print(single_dog.name)
- output
在创建对象的时候会调用这个初始化方法哟~
大东 is now sitting.
大东 rolled over!
大东
# 继承
子类可以继承父类,子类将获得父类的所有属性和方法。
语法
class Child_Class(Father_Class):
- 当无指定的父类需要继承时,可省略括号:
class Child_Class:
在创建子类对象之前,python首先需要创建父类对象并给父类对象的属性赋值,所以子类的初始化方法
def __init(self)__:
需要调用父类的__init__(self):
方法,先初始化父类。子类与父类在同一个文件
class Mobile:
"""
手机父类
"""
def __init__(self, company_name, mobile_name):
self.company_name = company_name
self.mobile_name = mobile_name
def print_mobile_basic_info(self):
"""
打印手机的基本信息
:return:
"""
print("这是" + self.company_name + "生产的手机,型号为" + self.mobile_name)
class Iphone(Mobile):
"""
iphone派生自mobile
"""
def __init__(self, company_name, mobile_name, produce_year):
"""
子类构造方法
"""
self.produce_year = produce_year
super().__init__(company_name, mobile_name)
def print_mobile_basic_info(self):
"""
重写父类的方法
:return:
"""
print("这是" + self.company_name + "在" + str(self.produce_year) + "年生产的手机,型号为" + self.mobile_name)
company_name = "Apple"
mobile_name = "Iphone11ProMax"
produce_year = 2019
iphone11_pro_max = Iphone(company_name, mobile_name, produce_year)
iphone11_pro_max.print_mobile_basic_info()
print(iphone11_pro_max.company_name)
- 子类与父类在不同的文件
- 在一个类中导入另外一个类
from classz.mobile import Mobile
class Iphone(Mobile):
def __init__(self, company_name, mobile_name, produce_year):
self.produce_year = produce_year
super().__init__(company_name, mobile_name)
iphone = Iphone(1, 1, 1)
- 类的命名规范:与Java一致,首字母大写的驼峰命名法。
- 实例的命名规范:小写+下划线
# 第十章 文件和异常
# 读取文件
-
open(file_path)
打开一个文件 -
with
:确保文件一定能关闭,且在合适的时机关闭。
- 也可以手动调用
close()
关闭文件,但是如果程序出bug了,导致close()
未执行,那么文件将不会被关闭,可能会导致数据受损。如果过早的关闭文件,可能导致需要使用的时候文件已经被关闭了。所以使用with
,交给python来做,是一个好的选择。
-
read()
读取文件的全部内容 - demo
- 要读取的文本
nums.txt
3.1234567890
9876543210
1234509876
- 读取程序
with open("nums.txt") as nums_file:
line = nums_file.read()
print(line)
- 在open文件时,告诉python我们需要向打开的文件中写入内容,
with open('file_path',model)
model的可选值可参见方法的文档- # 异常
如果未正确处理异常,程序将停止,并显示一个traceback,包含异常的报告。
- image.png
- python只能将字符串写入文件,所以在写入之前需要
str(content)
。
- image.png
- 处理异常
try-except-else
代码块 - 语法:
result:
image.png
逐行打印
image.png
为什么每次打印中间都空了一行:因为文件的每行末尾都有一个换行符,可使用rstrip()
消除
image.png
python默认将所有读取到的内容都作为字符串。
readlines()
: 返回一个列表
image.png
# 写入文件
try:
业务代码...
except 发生指定的错误:
发生错误时的处理程序
except 发生指定的错误:
发生错误时的处理程序
else:
未发生异常时将会执行的代码块
image.png
让python什么也不做:pass
# JSON
- 将python对象转为json对象存储到文件中:
json.dump(data_obj, json_file_path)
- 从文件中读取json字符串转换为python对象:
json.load(json_file_path)
import json
def json2file(file_path):
"""
对象转为json存入文件
:param file_path:
:return:
"""
# 以写入模式打开文件
with open(file_path, 'w') as json_file:
# 创建列表
num_list = list(range(1, 11))
# 将列表数据写入json
json.dump(num_list, json_file)
def file2json(file_path):
"""
文件内容转为json
:param file_path:
:return:
"""
# 打开文件
with open(file_path) as json_file:
# 加载文件中的json数据
json_result = json.load(json_file)
print(json_result)
file_path = "json.json"
json2file(file_path)
file2json(file_path)
# 第十一章 测试
步骤
- 创建测试文件:
test_xx.py
- 导入单元测试模块:
import unittest
- 导入需要进行测试的方法:
from module_name import function_name
- 创建测试类并且继承
unittest.TestCase
: class XxTestCase(unittest.TestCase):
- 根据需要测试的方法创建测试方法,命名必须以
tese
开头 def test_xx(self):
- 在测试测试方法中调用想要进行测试的方法
- 判断方法的结果是否符合预期
self.assert_xxx
-
unittest.main()
- 这一行的作用是让python运行这个测试。如果没有这一行,在运行
python xx.py
的时候并不会进行测试。
- 运行,命令行
python test_xx.py
- 在
pycharm
中直接运行似乎不会按照预期进行测试
eg:
def get_formatted_name(first_name: str, last_name: str):
"""
返回格式化之后的名字
:param first_name:
:param last_name:
:return:
"""
full_name = first_name.strip() + " " + last_name.strip()
return full_name.title()
- 测试用例:
# 导入测试工具模块
import unittest
# 导入要测试的方法
from test_demo import get_formatted_name
# 创建测试类,测试类必须继承`unittest.TestCase`
class NamesTestCase(unittest.TestCase):
# 创建测试方法,测试方法必须以`test`打头
def test_first_last_name(self):
# 调用测试方法
formatted_full_name = get_formatted_name("li", "dakang")
# 断言结果是否符合 预期
self.assertEqual(formatted_full_name, "Li Dakang")
# 让python运行这个测试。如果没有这一行,在运行`python xx.py`的时候并不会进行测试
unittest.main()
- 运行测试通过
- image.png 测试不通过
- 钩子方法
例如: setUp()
: 在每个测试方法执行之前执行
# 导入测试工具模块
import unittest
# 导入要测试的方法
from test_demo import get_formatted_name
# 创建测试类,测试类必须继承`unittest.TestCase`
class NamesTestCase(unittest.TestCase):
def setUp(self) -> None:
self.bool_value = True
print("=====在每个测试方法执行之前都会执行=====")
# 创建测试方法,测试方法必须以`test`打头
def test_first_last_name(self):
print("单元测试test_first_last_name开始执行")
# 调用测试方法
formatted_full_name = get_formatted_name("li", "dakang")
# 断言结果是否符合 预期
self.assertEqual(formatted_full_name, "Li DaKang")
def test_function(self):
print("单元测试test_function开始执行")
self.assertTrue(self.bool_value)
# 让python运行这个测试。如果没有这一行,在运行`python xx.py`的时候并不会进行测试
unittest.main()
image.png