004-python面向对象,错误,调试和测试

1. Python面向对象

面向对象编程(Object-oriented programming,简称OOP)是一种计算机编程架构,它将所有数据视为对象,将程序和函数视为对象的方法。Python是多种语言中比较容易理解和使用面向对象编程的语言之一。在Python中,任何事物都可以被看作为一个对象。比如,字符串、整数、列表、元组、字典等,它们都是一个单独对象,每个对象都有自己的属性和方法。

在Python中,我们可以用class语句来创建一个对象。通过创建对象,我们可以封装相似属性和方法,这样,我们就可以方便地重复使用这些代码。

1.1 创建类和对象

在Python中,类是一种抽象的概念,我们需要先定义类,然后才能创建对象。创建类可以使用class关键字:

class ClassName:

'类的帮助信息'

class_suite

其中,class_suite 是类成员,包括数据成员和成员函数。例如:

class Person:

name = "Jason"

age = 20

def say_hello(self):

print("Hello, my name is", self.name)

这个类有两个数据属性 name 和 age ,还有一个方法 say_hello() 。接下来我们用它创建一个对象:

jason = Person()

jason.say_hello()

这里我们创建了一个名为 jason 的对象,并调用了它的 say_hello() 方法。它会输出:

Hello, my name is Jason

1.2 继承

Python中的继承是一种非常重要的概念。它允许程序员让一个类继承另一个类的属性和方法。这种继承关系形成了类的层次结构,被称为父类和子类。子类可以继承父类的所有属性和方法,并且可以添加一些新的属性和方法。

Python中,我们可以使用 class 子句中的父类列表来指定一个类的一个或多个父类。例如:

class Student(Person):

grade = 'A'

def print_grade(self):

print("My grade is", self.grade)

在这个例子中,Student 类从 Person 类继承了 name 和 age 属性和 say_hello() 方法,并添加了一个新的属性 grade 和一个新的方法 print_grade()。我们可以创建一个 Student 对象,并调用它的方法:

tom = Student()

tom.say_hello()

tom.print_grade()

输出结果为:

Hello, my name is Jason

My grade is A

2. 错误

在编写程序中,难免会出现各种各样的错误。Python提供了一些方法来帮助我们找出这些错误。

2.1 语法错误

在Python中,如果代码中有语法错误,则会输出以下信息:

SyntaxError: invalid syntax

此错误通常是由于代码中的错误拼写、不闭合的括号、缩进错误等语法错误造成的。例如:

if a == b

print("a is equal to b")

在这个例子中,我们忘记了在 if 语句之后添加冒号 : ,因此会输出语法错误。

2.2 异常

异常是程序运行过程中产生的错误,通常表示一个不确定的或者无法处理的错误。在Python中,如果代码中有异常,则会输出有关异常的详细信息,并且停止执行代码。

ZeroDivisionError: division by zero

在这个例子中,我们试图除以零,因此会出现 ZeroDivisionError。

3. 调试

调试是指查找和修复程序中的错误的过程。在Python中,我们可以使用以下方法来调试程序:

3.1 使用 print 语句

在调试程序时,我们可以在代码中添加一些 print 语句来输出变量的值等信息,以便更好地了解程序的运行情况。

def add(a, b):

print("a =", a)

print("b =", b)

return a + b

result = add(3, 4)

print("result =", result)

在这个例子中,我们在函数的第一行和第二行添加了两个 print 语句,分别输出了 a 和 b 的值。最后一行输出了计算结果。

3.2 使用断点

在Python中,我们可以使用断点来暂停程序的运行,以便更好地了解程序的运行情况。

在Python3.7及以下版本中,我们可以使用 pdb 模块来设置断点。例如:

import pdb

def add(a, b):

pdb.set_trace()

return a + b

result = add(3, 4)

print("result =", result)

在这个例子中,我们在函数的第二行添加了一个 pdb.set_trace() 语句,它会在这里设置一个断点,暂停程序的运行。在程序运行到这里时,会弹出一个类似于 PDB> 的提示框,我们可以在这里输入各种命令来查看变量的值等信息。

在Python3.8及以上版本中,我们可以使用 breakpoint() 函数来设置断点。例如:

def add(a, b):

breakpoint()

return a + b

result = add(3, 4)

print("result =", result)

在这个例子中,我们在函数的第二行添加了一个 breakpoint() 函数,它会在这里设置一个断点,暂停程序的运行。在程序运行到这里时,会自动进入调试模式,我们可以使用各种命令来查看变量的值等信息。

4. 测试

测试是指测试程序代码的过程。在Python中,我们可以使用以下方法来测试程序:

4.1 单元测试

单元测试是指测试程序的最小单元,通常是某个函数或方法。在Python中,我们可以使用 unittest 模块来进行单元测试。

例如,我们有一个 add() 函数,它的作用是计算两个数字的和:

def add(a, b):

return a + b

我们可以使用以下代码来进行单元测试:

import unittest

class MyTest(unittest.TestCase):

def test_add(self):

self.assertEqual(add(3, 4), 7)

self.assertEqual(add(0, 0), 0)

self.assertEqual(add(-1, 1), 0)

if __name__ == '__main__':

unittest.main()

在这个例子中,我们定义了一个 MyTest 类,它继承自 unittest.TestCase 。我们在这个类中定义了一个 test_add() 方法,它分别测试了 add() 函数的三种情况。

在这个例子中,我们使用了 assertEqual() 方法来测试函数的输出值是否等于预期值。

如果所有测试用例都通过,会输出以下信息:

Ran 1 test in 0.000s

OK

4.2 集成测试

集成测试是指测试程序的多个部分之间的交互。在Python中,我们可以使用以下方法来进行集成测试:

4.2.1 使用 doctest 模块

doctest 模块可以让我们在文档字符串中编写测试用例。它会自动运行测试用例,并输出测试结果。

例如,我们有一个 add() 函数,它的作用是计算两个数字的和:

def add(a, b):

"""

Calculate the sum of two numbers.

>>> add(3, 4)

7

>>> add(0, 0)

0

>>> add(-1, 1)

0

"""

return a + b

在这个例子中,我们在函数的文档字符串中编写了测试用例。

如果我们在命令行中运行这个文件,会输出以下信息:

Ran 3 tests in 0.000s

OK

4.2.2 使用 unittest 模块

unittest 模块也可以用来进行集成测试。我们可以使用它来测试整个程序的各个部分之间的交互。

例如,我们有一个程序,它可以将一个数字列表排序并返回结果:

def sort_numbers(numbers):

"""

Sort numbers from small to large.

>>> sort_numbers([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5])

[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

"""

return sorted(numbers)

我们可以使用以下代码进行集成测试:

import unittest

class MyTest(unittest.TestCase):

def test_sort_numbers(self):

self.assertEqual(sort_numbers([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]), [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9])

self.assertEqual(sort_numbers([1, 2, 3, 4, 5]), [1, 2, 3, 4, 5])

self.assertEqual(sort_numbers([5, 4, 3, 2, 1]), [1, 2, 3, 4, 5])

self.assertEqual(sort_numbers([]), [])

if __name__ == '__main__':

unittest.main()

在这个例子中,我们定义了一个 MyTest 类,它继承自 unittest.TestCase 。我们在这个类中定义了一个 test_sort_numbers() 方法,它测试 sort_numbers() 函数的四种情况。

如果我们运行这个文件,会输出以下信息:

Ran 1 test in 0.000s

OK

4.3 性能测试

性能测试是指测试程序的响应时间、吞吐量等性能指标。在Python中,我们可以使用以下方法来进行性能测试:

4.3.1 使用 time 模块

我们可以使用 time 模块中的 time() 函数来计算程序运行的时间。例如:

import time

start_time = time.time()

# 程序代码

end_time = time.time()

print("程序运行时间:", end_time - start_time)

在这个例子中,我们首先使用 time() 函数获取程序开始运行时的时间,然后执行程序代码,最后再使用 time() 函数获取程序结束运行时的时间,并计算出程序运行的时间。

4.3.2 使用 cProfile 模块

cProfile 模块可以帮助我们分析程序代码的性能。它可以查看程序的调用堆栈、每个函数的执行时间等信息。

例如:

import cProfile

def test():

# 程序代码

cProfile.run("test()")

在这个例子中,我们定义了一个 test() 函数,并使用 cProfile.run() 函数来查看它的性能。

总结

在Python中,面向对象编程可以方便地封装代码,提高代码的可重用性。在编写程序时,我们难免会出现各种各样的错误,此时我们可以使用调试技术来找出错误。测试可以帮助我们确保程序的正确性和性能。

后端开发标签