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

# 第九章 类

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

  • 在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:


    image.png
  • 逐行打印


    image.png
    • 为什么每次打印中间都空了一行:因为文件的每行末尾都有一个换行符,可使用rstrip()消除
      image.png
  • python默认将所有读取到的内容都作为字符串。
  • readlines(): 返回一个列表
    image.png

# 写入文件

  • 在open文件时,告诉python我们需要向打开的文件中写入内容,with open('file_path',model)
  • model的可选值可参见方法的文档


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

# 异常

  • 如果未正确处理异常,程序将停止,并显示一个traceback,包含异常的报告。


    image.png
  • 处理异常try-except-else代码块
  • 语法:
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)

# 第十一章 测试

  • 步骤

    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的时候并不会进行测试。
    9. 运行,命令行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
    • 测试不通过


      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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341