Python面向对象、文件读取

面向对象

Python中类的定义以及对象的创建

所有的类默认全部继承object类,如果继承其他的类,则需要在类名后面添加括号,括号中填写父类名.

实例属性一定要写在__init__()中,相当于构造函数。

self参数:所有的实例方法(通过对象调用的方法)定义时必须以self作为第一个参数

self.some_property:实例属性

类属性不加self,而且不能定义在__init__()中。

对象在创建的时候首先调用__init__()函数

1
2
3
4
5
6
7
8
class DemoClass:
flag = True # 类的属性
def __init__(self, name, age):
self.name = name #实例属性
self.age = age # 实例属性

def print_info(self):#实例方法
print()

调用过程如下:

1
2
my_class = DemoClass('lzx', '21') # 首先实例化一个对象
my_class.print_info()

调用实例方法时不需要写self,在通过点调用的时候,已经隐式的把self规定为类的名字了

几种特殊方法

构造方法:在创建对象时会被自动调用

静态方法:使用@staticmethod修饰器来修饰,可以直接用类名或实例名调用,不能访问类的属性和方法。适用于逻辑上和类有关但是实际上和整个类关系不大的函数

1
2
3
4
5
6
7
8
class DemoClass:
flag = True # 类的属性
def __init__(self, name, age):
self.name = name #实例属性
self.age = age # 实例属性
@staticmethod
def my_func():
do_something()

类方法:使用@classmethod来修饰。第一个参数必须是cls,代表的是类本身。里面的参数只能是类属性,而不是实例属性

1
2
3
4
5
6
7
8
class DemoClass:
flag = True # 类的属性
def __init__(self, name, age):
self.name = name #实例属性
self.age = age # 实例属性
@classmethod
def my_func(cls, value):
do_something()

实例的权限比类大,所以说实例可以调用实例方法和类方法还有静态方法,而类名只能调用类方法和静态方法,但是如果传入了实例来当作self的参数的话,也是可以通过类名来调用实例方法的

面向对象-继承

通过继承,子类能立即获得父类的属性和方法,达到代码复用的目的,提高代码重用性,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Car:
def __init__(self, speed, color):
self.speed = speed
self.color = color
def drive(self):
print('drive')
def change_color(self, color):
self.color = color
print('color changed')

class BMW(Car):
pass
bmw = BMW(300, 'black')
bmw.change_color('red')

print(bmw.show_speed())

当Python中出现集成的情况时,一定注意__init__()函数,如果子类没有定义自己的初始化函数,则会默认调用父类的初始化函数,所以在构造子类的时候也只能传入父类的初始化函数要求的参数

如果子类自己定义了初始化函数,如果没有显式的调用父类的初始化方法,则父类初始化方法不会被调用,则是用子类的方法覆盖了父类的方法。所以父类的所有属性和方法都消失了。

显式调用父类方法如下:

1
super().__init__()

面向对象-继承重写

如果子类的方法和父类的同名方法逻辑不一样,则需要在子类中重写父类的方法,子类的方法会覆盖父类的同名方法。

文件读取

常用的文件读取方法

1
2
3
4
5
6
file = open('filename.txt', mode) # 后面的参数规定了读写,默认为‘r’,即读模式;写模式为'w'
content = file.read() # 读取所有内容
content_part = file.read(100) # 读取固定字节
content_oneline = file.readline() # 读取一行
content_all = file.readlines() #按行读取全部内容(列表形式)
file.close()

可以使用with(上下文管理器,用完之后自动回收,不需要close了),例如:

1
2
with open(r'D:\someplace\somefile.txt') as f:
print(f.read())

文件写入

使用 file_obj = open(‘filename.txt’, ‘r’),以写模式打开文件,在使用file.write()和file.writelines()来写入,前者写入一句,后者写入某个列表的全部内容(会自动换行)

每次通过w模式写入文件,以前的文件内容全部清空

写入多行:writelines(列表),将列表中的每一项写入文件,自动换行

如果以写模式打开不存在的文件,不会报错而是自动生成该文件,如果使用读方式则会报错