# 第九章 类
作为一个程序员,我根本不知道什么是
累
- 在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)
- result:
逐行打印
为什么每次打印中间都空了一行:因为文件的每行末尾都有一个换行符,可使用rstrip()消除
python默认将所有读取到的内容都作为字符串。
readlines(): 返回一个列表
# 写入文件
- 在open文件时,告诉python我们需要向打开的文件中写入内容,
with open('file_path',model)
- model的可选值可参见方法的文档
- python只能将字符串写入文件,所以在写入之前需要
str(content)
。
# 异常
- 如果未正确处理异常,程序将停止,并显示一个traceback,包含异常的报告。
- 处理异常
try-except-else
代码块 - 语法:
try: 业务代码... except 发生指定的错误: 发生错误时的处理程序 except 发生指定的错误: 发生错误时的处理程序 else: 未发生异常时将会执行的代码块
- 让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()
- 运行
- 测试通过
测试不通过
- 钩子方法
- 例如:
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()