面向对象
1
2
3
4
5
6
7
|
class Student:
def study(self, course_name):
print(f'学生正在学习{course_name}.')
def play(self):
print(f'学生正在玩游戏.')
|
上面定义了一个类,类中定义了两个成员方法,方法的第一个参数表示当前类的对象。
1
2
3
4
5
|
stu1 = Student()
stu2 = Student()
print(stu1) # <__main__.Student object at 0x10ad5ac50>
print(stu2) # <__main__.Student object at 0x10ad5acd0>
print(hex(id(stu1)), hex(id(stu2))) # 0x10ad5ac50 0x10ad5acd0
|
其中print中打印了stu1和stu2对象的在内存中的地址,用的是16进制表示的。用id方法也可以获取一个对象的16进制的值。和print中打印的地址是保持一致的。
1
|
Student.study(stu1, 'Python程序设计') # 学生正在学习Python程序设计.
|
通过类名.方法的时候,第一个参数需要传入对象,第二个参数是方法的参数。
1
|
stu1.study('Python程序设计') # 学生正在学习Python程序设计.
|
成员方法也可以通过对象来调用方法,其中方法的参数直接是成员方法的参数。同理play方法调用如下:
1
2
|
Student.play(stu2) # 学生正在玩游戏.
stu2.play() # 学生正在玩游戏.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class Student:
"""学生"""
def __init__(self, name, age):
"""初始化方法"""
self.name = name
self.age = age
def study(self, course_name):
"""学习"""
print(f'{self.name}正在学习{course_name}.')
def play(self):
"""玩耍"""
print(f'{self.name}正在玩游戏.')
# 调用Student类的构造器创建对象并传入初始化参数
stu1 = Student('张三', 44)
stu2 = Student('李四', 25)
stu1.study('Python程序设计') # 张三正在学习Python程序设计.
stu2.play() # 李四正在玩游戏.
|
在初始化方法中直接给类的成员变量赋值,并且也初始化了name和age属性。并且此时的属性是公开的,能在外部访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Student:
def __init__(self, name, age):
self.__name = name
self.__age = age
def study(self, course_name):
print(f'{self.__name}正在学习{course_name}.')
stu = Student('张三', 20)
stu.study('Python程序设计')
print(stu.__name) # AttributeError: 'Student' object has no attribute '__name'
|
还是上面的例子,将name和age属性给改为私有的了,直接给属性前面加下划线就可以了。
文件操作
1
2
3
|
file = open("file/1.txt","r",encoding='utf-8')
print(file.read())
file.close()
|
上面第一个参数是文件的路径,第二个参数是读的权限,第三个参数指定编码方式。
1
2
3
4
5
6
7
8
9
10
|
file = open('file/1.txt', 'r', encoding='utf-8')
for line in file:
print(line, end='')
file.close()
file = open('file/1.txt', 'r', encoding='utf-8')
lines = file.readlines()
for line in lines:
print(line, end='')
file.close()
|
上面两个方式都可以按行读取。
1
2
3
4
5
6
|
file = open('file/2.txt', 'a', encoding='utf-8')
file.write('床前明月光,')
file.write('\n疑是地上霜')
file.write('\n举头望明月')
file.write('\n低头思故乡')
file.close()
|
异常处理
1
2
3
4
5
6
7
8
9
10
11
12
13
|
file = None
try:
file = open('test.txt', 'r', encoding='utf-8')
print(file.read())
except FileNotFoundError:
print('无法打开指定的文件!')
except LookupError:
print('指定了未知的编码!')
except UnicodeDecodeError:
print('读取文件时解码错误!')
finally:
if file:
file.close()
|
上面演示了文件读取时候的异常捕捉,如果文件找不到则会抛FileNotFoundError异常,如果未指定编码格式,则会报LookupError异常,如果文件读取时候的编码格式和写入时候的编码格式不一致就会报UnicodeDecodeError异常。
1
2
3
4
5
6
7
8
9
10
11
|
class InputError(ValueError):
"""自定义异常类型"""
pass
def fac(num):
"""求阶乘"""
if num < 0:
raise InputError('只能计算非负整数的阶乘')
if num in (0, 1):
return 1
return num * fac(num - 1)
|
通过raise抛出异常,然后在使用fac函数的时候捕捉异常:
1
2
3
4
|
try:
print(f'{num}! = {fac(num)}')
except InputError as err:
print(err)
|