Python常见语法二

面向对象

  • 类的定义
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)
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy