# 第九章 类


作为一个程序员,我根本不知道什么是​​累​


  • 在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,包含异常的报告。

《Python编程:从入门到实践》学习记录(9-11)基础语法部分_python

  • image.png
  • python只能将字符串写入文件,所以在写入之前需要​​str(content)​​。

《Python编程:从入门到实践》学习记录(9-11)基础语法部分_python_02

  • image.png
  • 处理异常​​try-except-else​​代码块
  • 语法:


result:

《Python编程:从入门到实践》学习记录(9-11)基础语法部分_父类_03

image.png


逐行打印

《Python编程:从入门到实践》学习记录(9-11)基础语法部分_json_04

image.png
为什么每次打印中间都空了一行:因为文件的每行末尾都有一个换行符,可使用​​​rstrip()​​​消除

《Python编程:从入门到实践》学习记录(9-11)基础语法部分_json_05

image.png


python默认将所有读取到的内容都作为字符串。

​readlines()​​​: 返回一个列表

《Python编程:从入门到实践》学习记录(9-11)基础语法部分_json_06

image.png

# 写入文件

try:
业务代码...
except 发生指定的错误:
发生错误时的处理程序
except 发生指定的错误:
发生错误时的处理程序
else:
未发生异常时将会执行的代码块

《Python编程:从入门到实践》学习记录(9-11)基础语法部分_父类_07

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)

# 第十一章 测试

  • 步骤

  1. 创建测试文件:​​test_xx.py​
  2. 导入单元测试模块:​​import unittest​
  3. 导入需要进行测试的方法:​​from module_name import function_name​
  4. 创建测试类并且继承unittest.TestCase​​: ​class XxTestCase(unittest.TestCase):​
  5. 根据需要测试的方法创建测试方法,命名必须以tese​​开头 ​def test_xx(self):​
  6. 在测试测试方法中调用想要进行测试的方法
  7. 判断方法的结果是否符合预期​​self.assert_xxx​
  8. ​unittest.main()​
  • 这一行的作用是让python运行这个测试。如果没有这一行,在运行​​python xx.py​​的时候并不会进行测试。
  1. 运行,命令行​​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()



  • 运行测试通过

《Python编程:从入门到实践》学习记录(9-11)基础语法部分_父类_08

  • image.png 测试不通过

《Python编程:从入门到实践》学习记录(9-11)基础语法部分_json_09




  • 钩子方法
    例如: ​​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()

《Python编程:从入门到实践》学习记录(9-11)基础语法部分_json_10

image.png