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