当前位置: 首页 > news >正文

Python学习笔记(第三部分)

接续 Python.md 文件的第三部分

类的创建的基本使用

  • 创建一个类

    class Dog():''' 文档字符串:这是一次模拟小狗的简单尝试 '''def __init__(self,name,age):self.name = nameself.age = agedef sit(self):print(self.name.title() + " is now sitting.")def rollover(self):print(self.name.title() + " is now rolling over!")
    

    Dog()类中包含两个属性:name 和 age ,以及两个方法 sit() 和 rollover()。类中的函数称为方法,可以通过实例访问到的变量称为属性

    • __init__()方法,前后各有两个下划线,这是一个特殊的方法,在根据Dog()类创建实例时,python都会自动运行这个方法。
      • 这个方法中,形参 self 必须有,而且必须位于其他所有参数的前边,因为python在调用__init__()创建实例时,将自动传入实参 self
      • 每个与类相关联的方法调用都自动传入实参 self ,它是只想实例本身的引用,让实例能够访问到类中的属性和方法
      • 通过实参向 Dog() 传递 name 和 age 时,self会自动传递,因此不用自己传递它,只用给出后边两个实参
    • 以 self 为前缀的变量可以供类中的所有方法使用,而且还可以通过类的任何实例来访问这些变量
    • self.name = name 获取存储在形参 name 中的值,并将其存储在 name 变量中,然后将该变量关联到当前创建的实例
    • sit() 和 rollover() 方法不需要其他信息,因此只有一个形参 self
    • 类名通常是首字母大写,实例是小写
  • 创建类的实例,根据类来创建对象称为实例化

    class Dog():''' 文档字符串:这是一次模拟小狗的简单尝试 '''def __init__(self,name,age):self.name = nameself.age = agedef sit(self):print(self.name.title() + " is now sitting.")def rollover(self):print(self.name.title() + " is now rolling over!")my_dog = Dog('whill', 6)
    print("My dog's name is " + my_dog.name.title())   # 访问属性通过 句点表示法
    print("My dog's age is " , my_dog.age)my_dog.sit()
    my_dog.rollover()  # 访问方法通过 句点表示法
    

使用类和实例

  • Car类

    class Car():'''一次模拟汽车的简单尝试'''def __init__(self,make,model,year):'''初始化描述汽车的属性'''self.make = makeself.model = modelself.year = yeardef get_descriptive_name(self):long_name = str(self.year) + " " + self.make + " " + self.modelreturn long_namemy_new_car = Car("Audi", 'a6', 2016)
    print(my_new_car.get_descriptive_name())
    
  • 给属性指定默认值

    类的每个属性都必须有初始值,可以在__init__()方法内指定属性的初始值,此时无需包含为它提供初始值的形参

    class Car():'''一次模拟汽车的简单尝试'''def __init__(self,make,model,year):'''初始化描述汽车的属性'''self.make = makeself.model = modelself.year = yearself.odometer_reading = 0   # 为odometer_reading属性设置的初始值,不用再在形参中给出def get_descriptive_name(self):long_name = str(self.year) + " " + self.make + " " + self.modelreturn long_namedef read_odometer(self):'''打印汽车总里程'''print("Total odometer: " + str(self.odometer_reading) + " miles. ")my_new_car = Car("Audi", 'a6', 2016)
    print(my_new_car.get_descriptive_name())
    my_new_car.read_odometer()
    
  • 修改属性的值

    # 法一 通过实例直接访问它(不安全)
    my_new_car = Car("Audi", 'a6', 2016)
    my_new_car.odometer_reading = 23
    my_new_car.read_odometer()
    
    class Car():'''一次模拟汽车的简单尝试'''--snip--def update_odometer(self,mileage):'''将里程表修改为指定的值静止将里程表读数往回调'''if mileage > self.odometer_reading:self.odometer_reading = mileageelse:print("不允许作弊.")
    my_new_car = Car("Audi", 'a6', 2016)
    my_new_car.update_odometer(23)
    my_new_car.read_odometer()
    
  • 通过方法对属性的值进行递增

    class Car():'''一次模拟汽车的简单尝试'''def __init__(self,make,model,year):'''初始化描述汽车的属性'''self.make = makeself.model = modelself.year = yearself.odometer_reading = 0   # 为odometer_reading属性设置的初始值,不用再在形参中给出def get_descriptive_name(self):long_name = str(self.year) + " " + self.make + " " + self.modelreturn long_namedef read_odometer(self):'''打印汽车总里程'''print("Total odometer: " + str(self.odometer_reading) + " miles. ")def update_odometer(self,mileage):'''将里程表修改为指定的值静止将里程表读数往回调'''if mileage > self.odometer_reading:self.odometer_reading = mileageelse:print("不允许作弊.")def increment_odometer(self,miles):if miles > 0:self.odometer_reading += mileselse:print("不允许作弊.")used_car = Car("Audi",'a7',2019)
    print(used_car.get_descriptive_name())used_car.update_odometer(2650)
    used_car.read_odometer()used_car.increment_odometer(3000)
    used_car.read_odometer()
    

继承

  • 一个类继承一个类时,它将自动获得被继承类的所有属性和方法,原有的类称为父类或超类,新类称为子类

    class Car():'''一次模拟汽车的简单尝试'''def __init__(self,make,model,year):'''初始化描述汽车的属性'''self.make = makeself.model = modelself.year = yearself.odometer_reading = 0   # 为odometer_reading属性设置的初始值,不用再在形参中给出def get_descriptive_name(self):long_name = str(self.year) + " " + self.make + " " + self.modelreturn long_namedef read_odometer(self):'''打印汽车总里程'''print("Total odometer: " + str(self.odometer_reading) + " miles. ")def update_odometer(self,mileage):'''将里程表修改为指定的值静止将里程表读数往回调'''if mileage > self.odometer_reading:self.odometer_reading = mileageelse:print("不允许作弊.")def increment_odometer(self,miles):if miles > 0:self.odometer_reading += mileselse:print("不允许作弊.")class ElectricCar(Car):'''继承了类 Car'''def __init__(self,make,model,year):'''初始化父类的属性'''super().__init__(make,model,year)my_tesla = ElectricCar("tesla",'model y', 2018)
    print(my_tesla.get_descriptive_name())
    
  • 创建子类时,父类必须包含在当前文件中,而且必须子类的前边

  • 定义子类时,在括号内指定父类的名称class ElectricCar(Car):

  • super()是特殊的函数,使父类和子类关联起来

  • 给子类定义自己的特有属性和方法:

    class Car():---snip---class ElectricCar(Car):'''继承了类 Car'''def __init__(self,make,model,year):# 初始化父类的属性super().__init__(make,model,year) # 初始化自己特有的属性self.batery_size = 70def describe_battery(self):print("This car has a " + str(self.batery_size) + '-kWh battery.')my_tesla = ElectricCar("tesla",'model y', 2018)
    print(my_tesla.get_descriptive_name())
    my_tesla.describe_battery()
    
  • 重写父类的方法(定义一个和父类方法重名的方法)

    class Car():---snip---def fill_gas_tank(self):'''加油的方法'''print("加油中...")print("加油完成!")class ElectricCar(Car):def __init__(self,make,model,year):super().__init__(make,model,year)def fill_gas_tank(self):'''重写父类方法,电动车没有油箱'''print("This car doesn't need a gas tank.")
    

    重写父类方法后,在创建子类的实例时,Python会忽略掉原来父类中的方法

  • 将实例用作属性

    class Car():'''一次模拟汽车的简单尝试'''def __init__(self,make,model,year):'''初始化描述汽车的属性'''self.make = makeself.model = modelself.year = yearself.odometer_reading = 0   # 为odometer_reading属性设置的初始值,不用再在形参中给出def get_descriptive_name(self):long_name = str(self.year) + " " + self.make + " " + self.modelreturn long_namedef read_odometer(self):'''打印汽车总里程'''print("Total odometer: " + str(self.odometer_reading) + " miles. ")def update_odometer(self,mileage):'''将里程表修改为指定的值静止将里程表读数往回调'''if mileage > self.odometer_reading:self.odometer_reading = mileageelse:print("不允许作弊.")def increment_odometer(self,miles):if miles > 0:self.odometer_reading += mileselse:print("不允许作弊.")class Battery():def __init__(self,battery_size=70):'''初始化电瓶的属性'''self.battery_size = battery_sizedef describe_battery(self):print("This car has a " + str(self.battery_size) + '-kWh battery.')class ElectricCar(Car):def __init__(self,make,model,year):super().__init__(make,model,year)self.battery = Battery()   # 创建了一个Battery()的实例作为ElectricCar类的属性my_tesla = ElectricCar("tesla",'model y', 2018)
    print(my_tesla.get_descriptive_name())
    my_tesla.battery.describe_battery()
    

    有时候自己的类非常庞大,有非常多的属性和方法,这是可以采用上述方法,将类的一部分作为一个独立的类单独提取出来

    上边新建了一个Battery类,以后想要再对电池做分析就更简洁了

    class Battery():def __init__(self,battery_size=70):'''初始化电瓶的属性'''self.battery_size = battery_sizedef describe_battery(self):print("This car has a " + str(self.battery_size) + '-kWh battery.')def get_range(self):if self.battery_size == 70:range = 240elif self.battey_size == 80:range = 270message = "This car can go approximately " + str(range)message += " miles on a full charge."print(message)
    

导入类

  • 为了使文件更简洁,Python允许将类存储在模块中,然后在主程序中导入所需的模块

  • 可以把多个类放在一个模块中

    # car.py
    class Car():---snip---class Battery():---snip---class ElectricCar(Car):---snip---
    
  • 导入单个类

    from car import Car  # 从 car.py 文件中导入单个类 Car
    
  • 导入多个类

    from car import Car,ElectricCar  # 多个类之间用逗号分隔
    
  • 导入整个模块

    import carmy_tesla = car.ElectricCar("tesla",'model y', 2018)  # 需要用句点表达式的方式来访问需要的类
    

    使用module_name.class_name的方式访问需要的类

  • 导入模块中的所有类

    from car import *
    

    不推荐使用这种方法,因为可能发生类名冲突

  • 从一个模块中导入很多类时,最好是导入整个模块,然后在接下来的代码中使用module_name.class_name的方式访问需要的类

  • 还可以从一个模块中导入另外一个模块

    # car.py 模块
    class Car():---snip---
    
    # electric_car.py 模块
    from car import Car   # 从 car.py模块中导入Car类class Battery():---snip---class ElectricCar(Car):---snip---
    
    # my_cars.py
    from car import Car
    from electric_car import ElectricCarmy_beetle = Car("volk", 'beetle', 2018)
    print(my_beetle.get_descriptive_name())my_tesla = ElectricCar("tesla",'model y', 2018)
    print(my_tesla.get_descriptive_name())
    

自定义工作流程

  • 一开始应该尽可能的让结构简单,先尽可能的在一个文件中完成所有的工作,确定一切都能够正常运行后,再将类移到独立的模块中

文件

从文件中读取数据

with open('.//FileOP//pi_digits.txt') as file_object:contents = file_object.read()  print(contents)-->
3.141592653589793238462643383279# 多了一个空行
  • 使用 open() 函数打开文件,并返回一个表示该文件的对象

  • 关键字 with 在不再需要访问打开的文件后关闭该文件,就不用手动用 close() 函数关闭文件,但是不推荐这种做法,因为有的时候程序不能正常运行到 close() 这里导致文件不能够正确的关闭从而导致文件数据受损

  • 所以使用 with 结构来让 Python 自己决定在合适的时候关闭文件

  • 使用 read() 方法读取目标文件的全部内容,并将其作为一个字符串

  • read() 方法到达文件末尾时返回一个空字符串,因此打印出来时会多一个空行,可以使用**rstrip()**去除字符串末尾的空白

文件路径

  • 使用这种方法时,Python会在当前执行的文件所在的目录中查找文件

    with open('pi_digits.txt') as file_object:---snip---
    
  • 使用相对路径,这是Python会在当前执行的文件所在的目录中的FileOP文件夹中去找目标文件

    with open('FileOP\pi_digits.txt') as file_object:---snip---
    

    windows系统中,使用反斜杠(/)而不是斜杠(\),或者使用双斜杠\\,这样就可以防止被转义

  • 使用绝对路径,因为绝对路径通常比较长,所以经常把它放在一个变量中

    file_path = 'D:\GiteeRepository\python-project\jupyter\FileOP\pi_digits.txt'
    with open(file_path) as file_object:---snip---
    

逐行读取

  • 对文件对象使用for循环,以每次一行的方式检查文件:

    file_path = "FileOP/pi_digits.txt"
    with open(file_path) as file_object:for line in file_object:print("- " + line)--->
    - 3.1415926535-   8979323846-   2643383279

    每行的末尾都有一个空白行,这是因为在文件中,每行的末尾都有一个换行符,而print语句也会自己加上一个换行符,所以答应出来有一个空行

    可以使用**rstrip()**去除字符串末尾的空白

    file_path = "FileOP/pi_digits.txt"
    with open(file_path) as file_object:for line in file_object:print("- " + line.rstrip())
    
  • 创建一个包含文件多行的列表

    file_path = "FileOP/pi_digits.txt"
    with open(file_path) as file_object:lines = file_object.readlines()print(lines)  #  ['3.1415926535\n', '  8979323846\n', '  2643383279\n']
    

    readlines()方法从文件中读取每一行以列表的形式存储到lines中

  • Python读取我呢本文件时,对于所有的文本都解读为字符串,可以使用 int() 或 float() 函数转化成数字

写入文件

  • 写入空文件,调用 open() 时,多提供一个参数 ‘w’ ,这个参数称为模式参数,告诉Python要写入文件

    file_path = 'FileOP/programming.txt'with open(file_path, 'w') as file_obj:  # 如果目标文件不存在,函数 open() 就新建一个文件file_obj.write('I love programming.')
    
  • 打开文件时,可以指定写入模式:读取模式(’r’)写入模式(‘w’)附加模式(‘a’)读取和写入模式(‘r+’)

  • 写入模式(‘w’)打开文件时,如果目标文件中存在内容,Python在返回该文件对象时会清空该文件里的内容

  • python只能将字符串写入到文本文件,如果是数值型数据,必须要用 str() 转换成字符串格式

  • 写入多行,write函数不会自动添加换行符,需要自己手动加上

    file_path = 'FileOP/programming.txt'with open(file_path, 'w') as file_obj:file_obj.write('I love programming.\n')file_obj.write('I love creating new games.\n')
    
  • 附加到文件,使用 附加模式

    file_path = 'FileOP/programming.txt'with open(file_path, 'a') as file_obj:file_obj.write('I also love finding meaning in large datasets.\n')file_obj.write('I love creating apps that can run in a browser.\n')
    

异常

  • Python使用被称为异常的特殊对象来管理程序执行期间发生的错误

  • 如果代码中没有处理异常的代码块,程序会显示一个traceback

  • 异常是使用try-except代码块处理的

    # 处理 ZeroDivisionError:
    try:print(5/0)
    except ZeroDivisionError:print("You can't divide by zero.")
    

    这样就可以处理特定的异常,在上面代码中,可以处理ZeroDivisionError异常

    如果 try 代码块中的代码没有问题,Python将跳过except代码块,否则,将查找这样的except代码块:except 指定的错误与引发的错误相同,并运行其中的代码

  • else 代码块:

    print("Give me two numbers, and I'll diveide them.")
    print("Enter 'q' to quit.")while True:first_num = input('first_num: ')if first_num == 'q':breaksecond_num = input('second_num: ')if second_num == 'q':breaktry:answer = int(first_num) / int(second_num)except ZeroDivisionError:print("You can't divide by zero.")else:print("Answer: ", answer)
    

    在上述代码中,try 代码块中只包含可能导致错误的代码,如果发生错误将试图和except代码块中的错误匹配,如果没有错误就执行else代码块中的内容

    excpet代码块的作用是告诉Python,在遇到了指定的异常应该怎么办

  • 处理 FileNotFoundError 异常

    file_name = 'alice.txt'with open(file_name) as f_obj:contents = f_obj.read()   # FileNotFoundError: [Errno 2] No such file or directory: 'alice.txt'
    

    这个异常是 open 函数导致的,可以把 open 函数包含在 try 代码块中:

    file_name = 'alice.txt'try:with open(file_name) as f_obj:contents = f_obj.read()   
    except:msg = "Sorry, the file '" + file_name + "' does not exist."print(msg)
    
  • 分析文本

    title = 'Alice in Wonderland.'title.split()   # ['Alice', 'in', 'Wonderland.']
    

    split() 方法以空格为分隔符将字符串分拆成多个部份,并将这些部份都存储到一个列表中

    file_name = 'Alice in Wonderland.txt'try:with open(file_name) as f_obj:contents = f_obj.read()   
    except:msg = "Sorry, the file '" + file_name + "' does not exist."print(msg)
    else:words = contents.split()num_words = len(words)print("Total words nums: " + str(num_words))
    
  • 使用多个文件(包装成一个函数)

    def count_words(file_path):"""计算一个文件大致包含多少个单词"""try:with open(file_path) as f_obj:contents = f_obj.read()   except:msg = "Sorry, the file '" + file_name + "' does not exist."print(msg)else:words = contents.split()num_words = len(words)print("Total words nums: " + str(num_words))file_path = "./FileOP/alice.txt"
    count_words(file_path)
    
  • 使用 pass语句跳过对捕捉异常的处理部份

    def count_words(file_path):try:with open(file_path) as f_obj:contents = f_obj.read() except FileNotFoundError:passelse:words = contents.split()num_words = len(words)print("Total words nums: " + str(num_words))file_path = "./FileOP/alice.txt"
    count_words(file_path)        
    

    pass 语句充当了占位符,提醒自己在某个地方什么都没做

存储数据

  • 使用 json 格式存储数据

  • 使用 json.jump() 存储数据

    import jsonnumbers = [1, 2, 3, 4, 5]
    file_path = "./FileOP/numbers.json"
    with open(file_path, 'w') as file_obj:json.dump(numbers, file_obj)
    
  • 使用 json.load() 读取数据

    import json file_path = "./FileOP/numbers.json"
    with open(file_path) as file_obj:numbers = json.load(file_obj)print(numbers)
    
  • 一次实例:

    # rember_me.py
    import json
    file_path = "./FileOP/username.json"
    try:with open(file_path) as f_obj:user_name = json.load(f_obj)
    except FileNotFoundError:username = input("Tell me your name: ")with open(file_path, 'w') as f_obj:json.dump(username, f_obj)print("We will rember you, Dear  " + username)
    else:print("Welcome back, " + username)
    

测试

  • Python标准库中的模块unittest提供了代码测试工具
  • 单元测试用于核实函数的某个方面没有问题
  • 测试用例是一组单元测试,这些单元测试一起核实函数在各种情况下都符合要求
  • 全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式

测试函数

  • 要为函数编写测试用例,需要先导入模块unittest以及要测试的函数,在创建一个继承unitest.TestCase的类

    # name_function.pydef get_fullname(first,last):fullname = first + " " + lastreturn fullname.title()
    
    # test_name_function.py
    import unittest
    from name_function import get_fullnameclass NamesTestCase(unittest.TestCase):  # 类名可以自定义,但是应尽量包含Test,而且必须继承 unittest.TestCase 类""" 测试name_function.py """def test_first_last_name(self):fullname = get_fullname('jains', 'joplin')self.assertEqual(fullname, 'Jains Joplin')unittest.main()
    
  • 一个新的案例:

    # name_function.pydef get_fullname(first, last, middle=''):if middle:fullname = first + " " + middle + " " + lastelse:fullname = first + " " + lastreturn fullname.title()
    
    # test_name_function.py
    import unittest
    from name_function import get_fullnameclass NamesTestCase(unittest.TestCase):""" 测试name_function.py """def test_first_last_name(self):fullname = get_fullname('jan', 'joplin')self.assertEqual(fullname, 'Jan Joplin')def test_first_last_middle_name(self):fullname = get_fullname('wolf', 'dog', 'amazes')self.assertEqual(fullname, 'Wolf Dog Amazes')unittest.main()
    
  • 一个新的案例

    # city_functions.pydef get_formatted_city(city, country, population=''):if population:res = city + ', ' + country + '-' + str(population)else:res = city + ', ' + countryreturn res.title()
    # test_cities.pyimport unittest
    from city_functions import get_formatted_city as gfcclass CitiesTestCase(unittest.TestCase):""" 测试city_functions.py """def test_city_country(self):res = gfc('xian', 'china')self.assertEqual(res, 'Xian, China')def test_city_country_population(self):res = gfc('santiago', 'chile', 25000)self.assertEqual(res, 'Santiago, Chile-25000')# unittest.main()
    

测试类

  • unittest.TestCase中常用的断言方法

    方法用途
    assertEqual(a, b)验证 a == b
    assertNotEqual(a, b)验证 a != b
    assertTrue(x)验证 xTrue
    assertFalse(x)验证 xFalse
    assertIs(a, b)验证 a is b(对象身份相同)
    assertIn(item,list)验证 itemlist
    assertNotIn(item,list)验证 item 不在 list
    assertIsNot(a, b)验证 a is not b
    assertIsNone(x)验证 xNone
    assertIsNotNone(x)验证 x 不是 None
    assertIn(a, b)验证 a 包含在 b 中(a in b
    assertNotIn(a, b)验证 a 不包含在 b 中(a not in b
    assertIsInstance(obj, cls)验证 objcls 的实例
    assertNotIsInstance(obj, cls)验证 obj 不是 cls 的实例
    assertAlmostEqual(a, b, places=7)验证浮点数 ab 近似相等(精度为小数点后 places 位)
    assertNotAlmostEqual(a, b, places=7)验证浮点数 ab 不近似相等
    assertGreater(a, b)验证 a > b
    assertGreaterEqual(a, b)验证 a >= b
    assertLess(a, b)验证 a < b
    assertLessEqual(a, b)验证 a <= b
    assertListEqual(a, b)验证列表 ab 内容及顺序一致
    assertDictEqual(a, b)验证字典 ab 键值对完全一致
    assertTupleEqual(a, b)验证元组 ab 内容及顺序一致
    assertSetEqual(a, b)验证集合 ab 内容相同(忽略顺序)
    assertMultiLineEqual(a, b)验证多行字符串 ab 完全一致
  • 类的测试大部分工作是测试类中方法的行为:

    # suvery.py
    class AnonymousSurvey():""" 收集匿名调查问卷的答案 """def __init__(self, question):"""存储一个问题,并为存储答案做准备"""self.question = questionself.responses = []def show_question(self):"""显示调查问卷"""print(self.question)def store_responses(self, new_response):"""存储单份调查问卷"""self.responses.append(new_response)def show_results(self):"""显示收集到的所有答案"""print("Survey results: ")for res in self.responses:print('-' + res)
    
    # language_survey.py
    from survey import AnonymousSurvey as AS# 定义一个问题,并创建一个表示调查的AnonymousSurvey对象
    question = "What's your favorite language?"
    my_survey = AS(question)# 显示问题并存储答案
    my_survey.show_question()
    print("Enter 'q' to quit. ")
    while True:response = input("Please tell me your answer: ")if response == 'q':breakelse:my_survey.store_responses(response)# 显示调查结果
    print("\n Thank you: ")
    my_survey.show_results()
    
  • 开始测试AnonymousSurvey

    • 验证:如果用户面对调查问题时,只提供了一个答案,是否能够准确地存储

      # test_survey.py
      import unittest
      from survey import AnonymousSurveyclass TestAnonymousSurvey(unittest.TestCase):"""测试AnonymousSurvey类"""def test_store_single_response(self):question = "What your favorite language?"my_survey = AnonymousSurvey(question)my_survey.store_responses('English')self.assertIn('English', my_survey.responses)
      
    • 验证:如果用户提供了多个答案时,是否能够准确的存储:

      # test_survey.py
      import unittest
      from survey import AnonymousSurveyclass TestAnonymousSurvey(unittest.TestCase):"""测试AnonymousSurvey类"""def test_store_single_response(self):question = "What your favorite language?"my_survey = AnonymousSurvey(question)my_survey.store_responses('English')self.assertIn('English', my_survey.responses)def test_store_three_responses(self):question = "What your favorite language?"my_survey = AnonymousSurvey(question)responses = ['C++', 'C', 'Java']for res in responses:my_survey.store_responses(res)for res in responses:self.assertIn(res, my_survey.responses)
      
  • 使用方法 setUp(),在上边的TestAnonymousSurvey类中,每个测试方法都创建了一次AnonymousSurvey的实例,使用setUp()方法可以让我们只需创建一次实例对象,然后在每个测试方法中使用它:

    import unittest
    from survey import AnonymousSurveyclass TestAnonymousSurvey(unittest.TestCase):"""测试AnonymousSurvey类"""def setUp(self) -> None:"""创建一个调查对象和一组答案,供使用的测试方法使用"""question = "What your favorite language?"self.my_survey = AnonymousSurvey(question)  self.responses = ['C++', 'C', 'Java']def test_store_single_response(self):"""测试单个答案会被妥善的存储"""self.my_survey.store_responses(self.responses[0])self.assertIn(self.responses[0], self.my_survey.responses)def test_store_three_responses(self):"""测试多个答案会被妥善的存储"""for res in self.responses:self.my_survey.store_responses(res)for res in self.responses:self.assertIn(res, self.my_survey.responses)
    

    在方法setUp中创建了一个调查对象 my_survey 和一个答案列表 responses , 并且都添加了前缀self(即存储在属性中),因此可在这个类的任何地方使用

相关文章:

Python学习笔记(第三部分)

接续 Python.md 文件的第三部分 类 类的创建的基本使用 创建一个类 class Dog(): 文档字符串&#xff1a;这是一次模拟小狗的简单尝试 def __init__(self,name,age):self.name nameself.age agedef sit(self):print(self.name.title() " is now sitting.")def ro…...

【浅尝Java】Java简介第一个Java程序(含JDK、JRE与JVM关系、javcdoc的使用)

&#x1f35e;自我激励&#xff1a;每天努力一点点&#xff0c;技术变化看得见 文章目录 Java语言概述Java是什么Java语言的重要性Java语言发展简史Java语言特性 第一个Java程序main方法示例运行Java程序JDK、JRE、JVM之间的关系注释基本规则注释规范 标识符关键字 Java语言概述…...

【FreeRTOS-列表和列表项】

参照正点原子以及以下gitee笔记整理本博客&#xff0c;并将实验结果附在文末。 https://gitee.com/xrbin/FreeRTOS_learning/tree/master 一、列表和列表项的简介(熟悉) 1、什么是列表 答&#xff1a;列表是FreeRTOS中的一个数据结构&#xff0c;概念上和链表有点类似&#…...

22.2Linux的I2C驱动实验(编程)_csdn

我尽量讲的更详细&#xff0c;为了关注我的粉丝&#xff01;&#xff01;&#xff01; 这里我们用到的是stm32mp157的板子&#xff0c;所以我们看一下I2C用到的引脚。 1、硬件原理图分析 可以看到在这块板子上面用的SDA和SCL总线是PA11,PA12。所以要修改设备树和镜像文件&…...

socket-IO复用技术

五个I/O模型 1、阻塞I/O 2、非阻塞I/O 3、I/O复用&#xff08;select和poll&#xff09; 4、信号驱动I/O 5、异步I/O I/O复用 是一种在单线程或单进程环境下&#xff0c;同时监听多个 I/O 事件的技术。它允许程序高效地处理多个输入输出流&#xff08;如网络套接字、文件描…...

上位机知识篇---二进制操作

文章目录 前言接收数据示例:0xAA 0x12 0x34 0x55合并高/低字节数据RGB565颜色值:0xF800(红色)Python中负数右移接收帧:01 03 02 12 34 CRC前言 本文简单对单片机、上位机中的映射(Mapping)和位移操作符(Bit Shifting)等相关知识进行了简单介绍. 一、单片机与上位机中…...

openEuler 22.03 安装 Mysql 5.7,TAR离线安装

目录 一、检查系统是否安装其他版本Mariadb数据库二、环境检查2.1 必要环境检查2.2 在线安装&#xff08;有网络&#xff09;2.3 离线安装&#xff08;无网络&#xff09; 二、下载Mysql2.1 在线下载2.2 离线下载 三、安装Mysql四、配置Mysql五、开放防火墙端口六、数据备份七、…...

《排序算法总结》

引言&#xff1a; 编程学到现在&#xff0c;我们已经接触了很多种排序算法&#xff0c;这篇文章我就对常见的几种排序算法进行一个小结。 一&#xff1a; 排序算法分类&#xff1a; 二&#xff1a; 插入排序&#xff1a; 直接插入排序&#xff1a; 1. 概念&#xff1a; 直…...

【Java学习笔记】递归

递归&#xff08;recursion&#xff09; 思想&#xff1a;把一个复杂的问题拆分成一个简单问题和子问题&#xff0c;子问题又是更小规模的复杂问题&#xff0c;循环往复 本质&#xff1a;栈的使用 递归的注意事项 &#xff08;1&#xff09;需要有递归出口&#xff0c;否者就…...

体系学习1:C语言与指针1——预定义、进制打印、传参为数组

1、不对一段代码进行编译 #if 0 statement #endif2、输出地址 int d[3]{1,2,3}; printf("%p",(void*)d);//p期待的是void*类型的数据3、不同进制的打印 int data 1200; char hed[9];//为\0预留位置&#xff01;&#xff01;&#xff01; sprintf(hed,"%08X&…...

使用Java正则表达式进行分组与匹配文本提取

在Java开发中&#xff0c;正则表达式&#xff08;Regex&#xff09;是处理字符串的强大工具&#xff0c;广泛应用于数据验证、文本解析和格式转换等场景。通过正则表达式的分组功能&#xff0c;开发者可以精确地提取匹配模式的子部分&#xff0c;而不仅仅是整个匹配内容。Java的…...

RAGFlow上传3M是excel表格到知识库,提示上传的文件总大小过大

环境&#xff1a; Ragflowv0.17.2 问题描述&#xff1a; RAGFlow上传3M是excel表格到知识库&#xff0c;提示上传的文件总大小过大 解决方案&#xff1a; 定位问题&#xff1a; 1.查询Nginx 日志 Nginx 日志 检查 Nginx 配置中日志路径是否正确&#xff0c;确保日志文件有…...

2025年4月文章一览

2025年4月编程人总共更新了30篇文章&#xff1a; 1.2025年3月文章一览 2.《Operating System Concepts》阅读笔记&#xff1a;p528-p544 3.《Operating System Concepts》阅读笔记&#xff1a;p545-p551 4.《Operating System Concepts》阅读笔记&#xff1a;p552-p579 5.…...

2025大模型微调视频课程全套(附下载)

2025大模型微调视频课程全套&#xff0c;共10课。主要内容如下&#xff1a; 1、大模型的发展 2、Transformer & LLMs 3、大模型微调预览&Lora微调&Alpaca模型微调 4、Alpaca&AdaLoRA&QLoRA模型微调 5、Efficient Fine-tuning&Efficient Inference&…...

【Python Web开发】04-Cookie和Session

文章目录 1. Cookie1.1 定义1.2 工作原理1.3 用途1.4 优缺点 2. Session2.1 定义2.2 工作原理2.3 用途2.4 优缺点 3. Cookie 与 Session 的关系4. 安全性考量5. Python 中使用 Cookie 和 Session 在 HTTP 协议里&#xff0c;Cookie 和 Session 是用于管理客户端与服务器之间会话…...

从股指到期指,哪些因素影响基差?

当我们谈论股指期货&#xff08;简称“期指”&#xff09;与股票现货指数&#xff08;简称“股指”&#xff09;的基差时&#xff0c;其实是在探讨期货价格与现货价格之间的“差价”。这个差价受多种因素影响&#xff0c;时而扩大&#xff0c;时而缩小&#xff0c;甚至可能“翻…...

n8n 中文系列教程_15. 【工具篇】n8n中文版与汉化指南:从原理到实践

n8n 作为一款强大的开源自动化工具&#xff0c;目前尚未推出官方中文版&#xff0c;但社区提供了汉化方案。不过&#xff0c;对于技术用户&#xff0c;我们更推荐使用英文原版&#xff0c;以便更好地查阅文档和解决问题。如果你仍希望尝试汉化&#xff0c;本文将详细介绍如何通…...

3D版同步帧游戏

以下是实现一个3D版同步帧游戏的详细步骤与完整代码示例。我们将以第一人称射击游戏(FPS)为原型,重点讲解3D空间中的同步机制优化。 项目升级:3D版核心改动 1. 3D坐标系与消息结构 // common/messages.go type Vector3 struct {X float32 `json:"x"`Y float32 `…...

C语言中数字转化为字符串的方法

C语言中数字转化为字符串的方法 1. 使用 sprintf 函数 这是 stdio.h 头文件中的标准库函数 &#xff0c;功能类似于 printf &#xff0c;但不是输出到控制台&#xff0c;而是将格式化后的内容输出到字符数组&#xff08;字符串&#xff09;中。 示例代码&#xff1a; c #inc…...

使用MGeo模型高精度实现文本中地址识别

一、功能与安装 1、模型地址 模型是阿里开发的门址高精度识别模型。 https://modelscope.cn/models/iic/mgeo_geographic_elements_tagging_chinese_base/summary 注意&#xff1a;不能自己安装包&#xff0c;没法解决依赖问题&#xff0c;直接按照官方要求安装下面的包&am…...

OpenGL-ES 学习(15) ----纹理

目录 纹理简介纹理映射纹理映射流程示例代码&#xff1a;纹理的环绕和过滤方式纹理的过滤方式 纹理简介 现实生活中&#xff0c;纹理(Texture) 类似于游戏中皮肤的概念&#xff0c;最通常的作用是装饰 3D 物体&#xff0c;它像贴纸一样贴在物体的表面&#xff0c;丰富物体的表…...

类成员函数编译链接的过程

1.静态成员函数和普通成员函数 源文件编译成目标文件&#xff0c;静态成员函数和普通成员函数在目标文件代码段&#xff0c;函数添加进了符号表&#xff0c;地址是在代码段的相对地址&#xff0c;这个地址只是一个临时地址因为后面链接时还要合并代码段&#xff0c;函数地址还…...

PostgreSQL:pgAdmin 4 使用教程

pgAdmin 4 是一个用于管理和维护 PostgreSQL 数据库的强大工具。它提供了一个图形化界面&#xff0c;使用户能够轻松地连接到数据库、创建表、运行 SQL 语句以及执行其他数据库管理任务。 安装和使用 安装 pgAdmin 4 安装 pgAdmin 4 非常简单。下载并运行安装程序&#xff0…...

*(解引用运算符)与 ++(自增运算符)的优先级

在 C 和 C 等编程语言里&#xff0c;*&#xff08;解引用运算符&#xff09;与 &#xff08;自增运算符&#xff09;的执行优先级高低&#xff0c;要依据 是前缀形式还是后缀形式来确定。下面为你详细分析&#xff1a; 1. 后缀 运算符 后缀 运算符的优先级比 *&#xff08…...

二叉搜索树中的搜索(递归解决)

700. 二叉搜索树中的搜索 - 力扣&#xff08;LeetCode&#xff09; 二叉搜索树&#xff08;BST&#xff09;&#xff1a;以任意节点为根节点的数值大于其左子树所有节点的值&#xff0c;小于右子树所有节点的值。 查找二叉搜索树中的值&#xff0c;要利用节点之间的大小关系。…...

idea安装

1.卸载 2.安装 3.ssh...

在ASP.NET MVC中使用Repeater指南

虽然ASP.NET MVC框架本身不包含Web Forms中的Repeater控件&#xff0c;但您可以通过几种方式实现类似的功能。以下是几种在MVC中实现Repeater效果的方法&#xff1a; 1. 使用foreach循环 最简单的方法是直接在视图中使用Razor的foreach循环&#xff1a; csharp model IEnumer…...

【C语言常用字符串解析】

总结一下在 C 语言中用于字符串解析&#xff08;特别是从文件中读取行并提取数据&#xff09;的常用函数、 核心任务&#xff1a; 通常是从文件中读取一行文本&#xff08;一个字符串&#xff09;&#xff0c;然后从这个字符串中提取出需要的数据&#xff08;比如数字、单词等…...

基于深度学习农作物叶部病害实时检测系统研究(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

『MCP』初体验

『MCP』初体验 介绍 MCP 其实就是 Function Calling 的一个统一接口协议&#xff0c;网上介绍会有很多&#xff0c;所以这里不就重复介绍&#xff0c;这里主要是想记录说明一下 MCP 使用体验&#xff0c;可以帮助新人入门一下 安装 VSCode 以及 MCP client VSCode 自行安装…...

前端面试宝典---webpack原理解析,并有简化版源码

前言 先看一下webpack打包后的bundle.js&#xff0c;前边的直接扫一眼就过&#xff0c;可以发现这个立即执行函数的形参就是一个&#xff0c;key为引入文件路径&#xff0c;value为该模块代码的函数。 所以比较重要的就是通过webpack的配置文件中的entry的入口文件&#xff0c…...

负载均衡深度实践:基于Nginx+Keepalived的高可用方案与Zabbix监控设计

目录 综合实践-部署负载均衡 1 环境准备 2 zabbix监控nginx和keeplive 2.1 nginx安装 2.2 安装keepalived 2.3 部署vue 2.4 安装agent 2.5 zabbix监控nginx配置 2.6 zabbix监控keeplived 3 zabbix监控jar 3.1 安装agent 3.2 安装jdk 3.3 部署jar包 3.4 配置web 4…...

深度学习基础--目标检测入门简介

博主简介&#xff1a;努力学习的22级本科生一枚 &#x1f31f;​ 博客主页&#xff1a;羊小猪~~-CSDN博客 内容简介&#xff1a;探索AI算法&#xff0c;C&#xff0c;go语言的世界&#xff1b;在迷茫中寻找光芒​&#x1f338;​ 往期回顾&#xff1a;yolov5基础–一步一步教…...

Redis ⑧-RESP | 渐进式遍历 | 数据库管理

Redis data-types 除了之前学习的 string、hash、list、set、Zset 五种数据结构之外&#xff0c;Redis 还提供了 bitmap、bitfield、 hyperloglog、geospatial、stream 等数据结构。 另外的一些数据结构&#xff0c;都是在某些特定环境下才会使用&#xff0c;使用频率不高&…...

【Android】四大组件之ContentProvider

目录 一、什么是 ContentProvider 二、创建和使用 ContentProvider 三、跨应用权限控制 四、数据变更通知 五、多表关联与视图 六、异步处理 你手机里的通讯录&#xff0c;存储了所有联系人的信息。如果你想把这些联系人信息分享给其他App&#xff0c;就可以通过ContentP…...

Qwen3 发布:优化编码与代理能力,强化 MCP 支持引领 AI 新潮流

人工智能领域的每一次重大突破都如同璀璨星辰&#xff0c;照亮了人类前行的道路。2025 年 4 月 29 日凌晨&#xff0c;阿里巴巴旗下的 Qwen 官方团队正式发布了最新一代大语言模型 ——Qwen3&#xff0c;犹如一颗重磅炸弹&#xff0c;在 AI 领域掀起了惊涛骇浪。此次发布&#…...

LEETERS题解

【题目描述】 给出一个rowcolrowcol的大写字母矩阵&#xff0c;一开始的位置为左上角&#xff0c;你可以向上下左右四个方向移动&#xff0c;并且不能移向曾经经过的字母。问最多可以经过几个字母。 【输入】 第一行&#xff0c;输入字母矩阵行数RR和列数SS&#xff0c;1≤R,S≤…...

图像加密算法概述

版本: 1.0 日期: 2025年5月1日 目录 引言 1.1 什么是图像加密?1.2 为什么需要图像加密?1.3 图像数据的特点与加密挑战加密基础概念 2.1 明文与密文2.2 加密与解密2.3 密钥2.4 对称加密与非对称加密为什么传统文本加密算法不完全适用于图像? 3.1 数据量巨大3.2 高度冗余性…...

loads、dumps、jsonpath使用场景

在处理JSON数据时&#xff0c;loads、dumps 和 jsonpath 是三个非常有用的工具或概念。它们各自在不同的场景下发挥作用&#xff0c;让我们一一来看&#xff1a; 1. loads loads 函数是 Python 中 json 模块的一部分&#xff0c;用于将 JSON 格式的字符串解析成 Python 的数据…...

Winform(7.序列化方式整理)

今天我又对序列化方式进行了整理,可以与上一篇序列化方式一起看 一.序列化方式(四种) 1.二进制序列化 //定义 Person 类,需要标记为可序列化 [Serializable] public class Person { public string Name{get;set;} public int Age{get;set;} } 在进行二进制序列化…...

通过AI的联网功能提升搜索检索能力

以百度ai搜索&#xff08;百度AI搜索 - 办公学习一站解决&#xff09;为例&#xff0c;ai会自动根据问题搜集现有互联网文章&#xff0c;避免人工通过传统检索引擎的结果逐个去查找&#xff0c;这种方式文章的相关性会更高。 tip&#xff1a;快速查看每篇文档&#xff0c;仅关…...

Spring IoC容器的设计与实现

Spring整体架构与模块划分 核心容器&#xff08;Core Container&#xff09; spring-core 基础工具类&#xff1a;如资源加载&#xff08;Resource接口&#xff09;、反射工具&#xff08;ReflectionUtils&#xff09;、类型转换&#xff08;ConversionService&#xff09;。…...

使用vue的插值表达式渲染变量,格式均正确,但无法渲染

如图&#xff0c;作者遇到的问题为&#xff0c;输入以下代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

数据库 AI 助手测评:Chat2DB、SQLFlow 等工具如何提升开发效率?

一、引言:数据库开发的 “效率革命” 正在发生 在某互联网金融公司的凌晨故障现场,资深 DBA 正满头大汗地排查一条执行超时的 SQL—— 该语句涉及 7 张核心业务表的复杂关联,因索引缺失导致全表扫描,最终引发交易系统阻塞。这类场景在传统数据库开发中屡见不鲜:据 Gartne…...

21.1Linux中的LCD驱动实验(知识)_csdn

1、LCD 和 LTDC 简介 1.1、LCD 简介 1.1.1、分辨率 1.1.2、像素格式 可以看到红、绿、蓝每个8位&#xff0c;还有一位是A7~A0就是透明通道&#xff0c;32位ARG8888。 1.1.3、LCD 屏幕接口 1.1.4、LCD 时间参数 如果将 LCD 显示一帧图像的过程想象成绘画&#xff0c;那么…...

Angular教程前言:历史、安装与用途

Angular 是一个强大且流行的开源前端 Web 应用程序框架&#xff0c;由 Google 开发并维护 1。它在现代 Web 开发中占据着重要的地位&#xff0c;尤其在构建动态、高效且可扩展的 Web 应用程序方面表现出色&#xff0c;特别适用于单页应用程序 (SPA) 和复杂的用户界面 1。本教程…...

node.js模块化步骤(各标准区别)CommonJS规范、AMD规范、UMD规范、ES Modules (ESM)

前后端建议统一使用ESM 文章目录 Node.js模块化发展历程与标准对比一、模块化的意义1.1 解决的核心问题1.2 没有模块化的问题 二、CommonJS规范2.1 核心特征2.2 实现示例 三、AMD (Asynchronous Module Definition)3.1 特点3.2 代码示例 四、UMD (Universal Module Definition)…...

Unity图片导入设置

&#x1f3c6; 个人愚见&#xff0c;没事写写笔记 &#x1f3c6;《博客内容》&#xff1a;Unity3D开发内容 &#x1f3c6;&#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f50e;Unity支持的图片格式 ☀️BMP:是Windows操作系统的标准图像文件格式&#xff0c;特点是…...

MySQL与分布式架构的碰撞

目录 一、分布式架构的核心挑战与MySQL的应对策略 1.1 高并发与扩展性 1.3 高可用与容灾 二、MySQL分布式架构的核心技术实现 2.1 读写分离与主从复制&#xff08;扩展&#xff09; 2.2 数据分片与分布式存储&#xff08;扩展&#xff09; 2.3 MySQL Cluster与NDB引擎&am…...

python-MySQL鏈接

python鏈接MySQL&#xff0c;主要利用庫 pip install mysql-connector-pythonimport mysql.connector# 配置连接参数 config {"user": "your_username","password": "your_password","host": "localhost", # 或…...