一.文件操作

文件是存储在磁盘上的数据集合。文件可以包含各种类型的数据,如文本、图像、音频等等。

文件系统通过文件名和文件路径来定位和管理文件。文件名通常包含文件的名称和和扩展名。文件路径可以是绝对路径也可以是相对路径。

1.文件的分类

纯文本文件:有统一的编码,可以被看做存储在磁盘上的长字符串。

二进制文件:没有统一的字符编码,由0与1组成。

2.文件的路径

相对路径:从相对路径到指定位置的路径。

绝对路径:从根目录到指定位置的路径。

3.文件的打开和关闭

打开文件

使用open()打开或者创建文件,该方法执行完毕之后返回的是一个file对象

file_object = open(file_path, mode='r', encoding=None)
 
  • file_path: 文件路径(绝对或相对路径)
  • mode: 打开模式,常见选项:
    • 'r': 只读(默认),文件若不存在不会报错
    • 'w': 写入(覆盖原有内容),文件不存在会创建文件
    • 'a': 追加写入,文件不存在会创建文件
    • 'b': 二进制模式(如 'rb'
    • '+': 读写模式(如 'r+'),能读能写
    • ‘x’:创建新文件并且写入,文件若存在会报错
  • encoding: 指定编码(如 'utf-8'),避免乱码

文件关闭方法

file_object.close()
#建立连接(通过open方式打开文件)
file = open("text.txt","w")

#写入数据
file.write("hello world\n")
file.write("ni hao \n")

#关闭连接
file.close()

文件读取

使用内置函数 open() 打开文件,指定文件路径和模式(如 'r' 表示读取)。通过文件对象的 read() 方法获取内容,操作完成后需调用 close() 关闭文件。

file = open('example.txt', 'r')
content = file.read() #如果read(size),加了参数size,表示从文件中读取的字符/字节数
file.close()
 

readlines和readline

调用 readlines() 方法时,不需要传递参数。它会返回文件中所有行的列表,每行末尾包含换行符 \n

with open('example.txt', 'r') as file:
    lines = file.readlines()
 

readlines() 方法支持一个可选参数 hint,用于指定读取的字节数。当读取的字节数达到或超过 hint 时,停止读取。若未指定 hint,则读取整个文件。

with open('example.txt', 'r') as file:
    lines = file.readlines(100)  # 读取大约 100 字节的内容
 
  • readline() 每次调用只读取一行,返回一个字符串。
  • readlines() 一次性读取所有行,返回一个字符串列表。

与 read() 的区别

  • read() 读取整个文件内容,返回一个字符串。
  • readlines() 按行分割内容,返回字符串列表。

4.文件操作常用函数

以下是一些常见的文件操作函数及其用途的总结表格:

函数/方法 用途描述
open() 打开文件,返回文件对象。可以指定模式(如读取、写入、追加等)。
close() 关闭文件,释放系统资源。
read() 读取文件内容,可以指定读取的字节数。
readline() 读取文件的一行内容。
readlines() 读取文件的所有行,返回一个列表。
write() 将字符串写入文件。
writelines() 将字符串列表写入文件。
seek() 移动文件指针到指定位置。
tell() 返回文件指针的当前位置。
os.rename() 重命名文件或目录。
os.remove() 删除文件。
os.path.exists() 检查文件或目录是否存在。
os.path.isfile() 检查路径是否为文件。
os.path.isdir() 检查路径是否为目录。
os.path.getsize() 获取文件的大小(字节)。
shutil.copy() 复制文件到指定路径。
shutil.move() 移动文件或目录到指定路径。
shutil.rmtree()

递归删除目录及其内容。

# 打开文件并读取内容
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

# 写入文件
with open('output.txt', 'w') as file:
    file.write('Hello, World!')

# 检查文件是否存在
import os
if os.path.exists('example.txt'):
    print('File exists')
else:
    print('File does not exist')

# 复制文件
import shutil
shutil.copy('example.txt', 'backup.txt')

5.部分函数需要导入os模块

os 模块是 Python 中用于与操作系统交互的核心模块,提供了许多文件与目录操作的函数。以下是一些需要导入 os 模块的常用函数及其用途:

一定要执行 import os

os.remove(): 删除指定文件。

os.remove('file.txt')
 

os.rename(): 重命名文件或目录。

os.rename('old.txt', 'new.txt')
 

os.mkdir(): 创建单层目录。

os.mkdir('new_folder')
 

os.makedirs(): 递归创建多层目录。

os.makedirs('path/to/new_folder')

os.getcwd() 不需要任何参数,直接返回当前工作目录的字符串形式。例如:

import os
current_dir = os.getcwd()
print(current_dir)
 

6.os.walk() 的基本用法

os.walk() 是 Python 中用于递归遍历目录树的函数,返回一个生成器,每次迭代生成一个三元组 (root, dirs, files)root 是当前遍历的目录路径,dirs是当前目录下的子目录列表,files 是当前目录下的文件列表。

import os

for root, dirs, files in os.walk(os.getcwd()): #os.getcwd()获取文件路径
    print(f"当前目录: {root}")
    print(f"子目录: {dirs}")
    print(f"文件: {files}")
 

7.文件拷贝

def copy_file(src,dest):
    #打开原文件
    src_file = open(src,'rb')
    #打开目标文件
    dest_file = open(dest,'wb')


    content = src_file.read(1024)
    while content:
        dest_file.write(content)
        content = src_file.read(1024)

""" 
简要写法:
    while content := src_file.read(1024)
        dest_file.write(content)
"""

    #关闭源文件
    src_file.close()
    #关闭目标文件
    dest_file.close()


copy_file(src:"d:\\hug.png" , dest:"e:\\hua.png")

二.面向对象之类和对象

面向过程编程(Procedural Programming)以过程(函数)为核心,强调程序的执行流程。代码由一系列函数组成,每个函数完成特定任务,通过函数调用来组织程序逻辑。

特点:

  • 程序结构简单直观,适合解决线性问题。
  • 数据与操作分离,函数通常处理外部传入的数据。
  • 代码复用通过函数调用实现。

面向对象编程(Object-Oriented Programming, OOP)以对象为核心,将数据和方法封装在对象中。主要特性包括封装、继承和多态。

特点:

  • 程序由对象组成,对象包含属性和方法。
  • 通过类和实例实现代码复用与扩展。
  • 更适合复杂系统建模,提高代码可维护性。

核心概念:

  • 封装:隐藏对象内部细节,暴露接口。
  • 继承:子类继承父类特性,实现代码复用。
  • 多态:同一接口在不同条件下表现不同行为。

面向过程举例:

# 定义计算圆面积的函数
def calculate_area(radius):
    return 3.14159 * radius ** 2

# 定义计算圆周长的函数
def calculate_circumference(radius):
    return 2 * 3.14159 * radius

# 主程序
radius = float(input("请输入圆的半径: "))
area = calculate_area(radius)
circumference = calculate_circumference(radius)

print(f"圆的面积: {area:.2f}")
print(f"圆的周长: {circumference:.2f}")
 

面向对象举例:

class Dog:
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age

    def bark(self):  # 实例方法
        print(f"{self.name} says: Woof!")
 
my_dog = Dog("Buddy", 3)  # 创建Dog类的实例
print(my_dog.name)        # 输出: Buddy
my_dog.bark()             # 输出: Buddy says: Woof!

1.面向对象相关概念

对象:万物皆对象,在自然界中只要是客观存在的事物都是对象

类:类是对大量对象的共性的抽象(关注有什么---属性,能做什么---方法);类是创建对象的模板。

2.定义类

通过 class 关键字定义,用于创建对象。类可以包含属性(变量)和方法(函数)。

class Person:
    """人的类"""
    #属性 -- 类属性(所有类创建出来的对象共用)
    home = "earth"

    #方法
    def __init__(self,name,age):
        #属性--实例属性(每个类创建出来的对象独有)
        self.name = name
        self.age = age

    def eat(self):
        print(f"{self.name} is eating")

说明:

类是对大量共性的抽象,其中主要定义了属性和方法

calss是一个关键字,主要用来标记定义类

person是当前类的类名

类名后的:必须要加

缩进后的内容是类体

属性

        类属性:所有类创建出来的对象(实例)共用

        实例属性:每个类创建出来的对象独有

方法

        实例方法

修改类属性的影响

通过类名修改类属性会影响所有未重写该属性的实例。直接修改实例属性仅影响当前实例。

class Dog:
    species = "Canis familiaris"

dog1 = Dog()
dog2 = Dog()
Dog.species = "New species"  # 修改类属性
print(dog1.species)  # 所有实例同步更新
print(dog2.species)
 

3.类的操作:成员引用和实例化

成员引用:直接通过类名访问类中的成员

class MyClass:
    class_var = "Class Variable"  # 类变量
    def __init__(self, value):
        self.instance_var = value  # 实例变量
    def instance_method(self):
        return self.instance_var

# 类成员引用
print(MyClass.class_var)  # 输出: Class Variable

# 实例成员引用
obj = MyClass("Instance Value")
print(obj.instance_var)    # 输出: Instance Value
print(obj.instance_method())  # 输出: Instance Value
 
class Person:
    """人的类"""
    #属性 -- 类属性(所有类创建出来的对象共用)
    home = "earth"

    #方法
    def __init__(self,name,age):
        #属性--实例属性(每个类创建出来的对象独有)
        self.name = name
        self.age = age

    def eat(self):
        print(f"{self.name} is eating")


#类操作
home = Person.home #输出earth
eat_fuc = Person.eat #输出函数<function Person.eat at 0x00002342had22323>
doc = Person.__doc__ #类说明文档

实例化:通过类 创建对象

实例化是创建类的具体对象的过程,通过调用类的构造函数(如 __init__)完成。

  • 语法object_name = Class_name(arguments),其中 arguments传递给构造函数。
  • 关键点
    • 实例化时会自动调用 __init__ 方法初始化对象。
    • 每个实例拥有独立的实例变量,类变量被所有实例共享。
class Person:
    def __init__(self, name, age):
        self.name = name  # 实例变量
        self.age = age

    def eat(self):
        print(f"{self.name} is eating")
# 实例化
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)
print(person1.name)  # 输出: Alice
print(person2.age)   # 输出: 25
person1.eat() #输出Alice is eating

4.__init__方法

在定义类的时候,__init__不是必须的

它主要作用是在创建类的对象时,对对象的属性进行初始化。当你使用类名创建一个新的对象时,python会自动调用它,并将新创建的对象作为第一个参数(通常命名为self)传递给它。

注意:

self:这是一个约定俗成的参数名,它代表类的实例对象本身。在方法内部,通过self可以访问和修改对象的属性。

__init__方法不是必须的。如果类中没有定义,python会使用默认的构造函数,该构造函数不执行任何操作。

__init__方法只能返回none,不能返回其他值。如果尝试返回其他值,会引发typeerror异常

Python 中的 __new____init__ 方法

__new____init__ 是 Python 中用于对象初始化的两个特殊方法,它们在对象创建过程中扮演不同的角色。

__new__ 方法

__new__ 是一个静态方法,负责创建并返回类的实例。它在 __init__ 之前被调用,通常用于控制实例的创建过程。

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__ called")
        instance = super().__new__(cls)
        return instance

__init__ 方法

__init__ 是一个实例方法,负责初始化新创建的对象。它在 __new__ 返回实例后被调用。

class MyClass:
    def __init__(self, value):
        print("__init__ called")
        self.value = value

  • __init__ 的第一个参数是 self,表示当前实例。
  • 不需要返回值,默认返回 None
  • 主要用于设置实例的初始属性。

区别对比

特性 __new__ __init__
调用顺序 先调用 后调用
参数 cls self
返回值 必须返回实例 无返回值
主要用途 控制实例创建 初始化实例属性
是否必须定义 不定义时使用父类的 __new__ 可选

5.self

self作为实例穿参。调用实例方法时候,实例对象会作为第一个参数被传入。因此,我们调用p.eat()相当于调用了Person.eat(p)

class Person:
    def __init__(self, name, age):
        self.name = name  # 实例变量
        self.age = age

    def eat(self):
        print(f"{self.name} is eating")

p = Person(“liujie”)
p.eat() #和Person.eat(p) 一样

通过self在类中调用类的实例属性和实例方法

实例属性通常在 __init__ 方法中定义,并通过 self访问或修改:

class MyClass:
    def __init__(self, value):
        self.value = value  # 定义实例属性
    
    def show_value(self):
        print(self.value)  # 通过self访问实例属性
 
  • self.value 是实例属性,每个实例的 value 可以不同。
  • 在类的方法中,通过 self.value 可以读取或修改该属性。

实例方法通过 self 调用其他实例方法:

class MyClass:
    def method1(self):
        print("Method 1 called")
    
    def method2(self):
        self.method1()  # 通过self调用另一个实例方法
        print("Method 2 called")
 
  • self.method1() 调用了同一个类中的 method1方法。
  • 实例方法必须通过 self 调用,否则会报错。

实例属性可以在任何实例方法中动态修改:

class Counter:
    def __init__(self):
        self.count = 0
    
    def increment(self):
        self.count += 1  # 修改实例属性
    
    def get_count(self):
        return self.count
 

6.类属性

也叫类变量。在类中方法外定义的属性

通过 类名.属性名实例名.属性名 访问

class Person:
    """人的类"""
    #属性 -- 类属性(所有类创建出来的对象共用)
    home = "earth"


print(Person.home)
p1 = Person()
print(p1.home)

通过 类名.属性名 添加与修改类属性

class Person:
    """人的类"""
    #属性 -- 类属性(所有类创建出来的对象共用)
    home = "earth"



print(Person.home) #输出earth
p1 = Person()
print(p1.home) #输出earth

Person.home = "xupu"
print(Person.home) #输出xupu


若用实例名.属性名 则会创建或者修改实例属性,因此不建议类属性和实例属性同名

class Person:
    """人的类"""
    #属性 -- 类属性(所有类创建出来的对象共用)
    home = "earth"



print(Person.home) #输出earth
p1 = Person()
p1.home = "xupu"
print(p1.home) #输出xupu

p2 = Person()
print(p2.home) #输出earth

所有该类的实例共享同一个类属性

class Person:
    """人的类"""
    #属性 -- 类属性(所有类创建出来的对象共用)
    home = "earth"



print(Person.home) #输出earth
p1 = Person()
p1.home = "xupu"
print(p1.home) #输出xupu

p2 = Person()
print(p2.home) #输出earth

Person.home = "mars"
print(p1.home) #输出xupu
print(p2.home) #输出mars

7.实例属性

一般在__init__方法中定义实例属性

class Person
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def eat(self):
        print(""eating)

person1 = Person("liujie",24)

Python 允许在类外部直接为实例添加新属性:

person1.school = uibe  # 动态添加属性
print(person1.school)  # 输出: uibe
 

使用 del 关键字可删除实例属性:

del person1.school  # 删除属性
 

8.类的方法

三种方法:实例方法、静态方法、类方法

实例方法:在类中定义,第一个参数为self,代表实例本身;实例方法只能被实例对象调用;可以访问实例属性、类属性、类方法。

class Person:
    home = "earth"

    def __init__(self,name)
        self.name = name

    def m2(self):
        print("m2222")

    def m1(self):
        print("self.name")
        print(Person.home)
        self.m2() #等价于Person.m2()

zs = Person("zs")
zs.m1()

类方法

在类中通过@classmethod定义,第一个参数为cls,代表本身类。

类方法可以被类和实例对象调用

可以访问类属性

在不创建实例的情况下调用,通过类名直接调用,非常方便,适合一些和类整体相关的操作

class Person:
    """human beings"""

    home = "earth"

    @classmethod
    def class_method(cls):
        print(cls.home)
        print(cls.__doc__)

zs = Person("zs")
Person.class_method() #通过类名可以直接访问类方法

静态方法

在Python中,静态方法是通过@staticmethod装饰器定义的类方法。静态方法不需要访问类实例(self)或类本身(cls),与普通函数类似,但逻辑上属于类的命名空间。

class MathUtils:
    @staticmethod
    def m1():
        print("niu")

# 通过类调用
result = MathUtils.m1() # 输出 niu

# 通过实例调用(不推荐)
util = MathUtils()
result = util.m1()  # 输出 niu
 

9.在类外定义方法

并非必须在类中进行方法定义,也可以将一个函数对象复制给一个类内局部变量

"""例子1"""
def external_method(self):
    return "This is an external method"

class MyClass:
    pass

# 将外部函数绑定为实例方法
MyClass.external_method = external_method

# 使用
obj = MyClass()
print(obj.external_method())  # 输出: This is an external method
 

"""例子2"""
def m5(self,x,y)
    print(x+y)

class Myc:
    f1 = m5

Myc().f1(1,2) #输出3

10.魔法方法

魔法方法(Magic Methods)是 Python 中一类特殊的方法,以双下划线 __ 开头和结尾。它们用于定义类的行为,例如初始化、运算符重载、对象表示等。

常用魔法方法分类

1. 初始化与构造
__init__(self, ...):构造函数,在对象创建时调用。
__new__(cls, ...):创建实例时调用,通常用于不可变类型的定制。
__del__(self):析构函数,在对象销毁时调用。使用del xxx时候,不会执行__del__

2. 对象表示
__str__(self):定义对象的字符串表示(str(obj) 或 print(obj))。
__repr__(self):定义对象的官方字符串表示(repr(obj))。
__format__(self, format_spec):定义对象的格式化输出(format(obj, spec))。

3. 运算符重载
__add__(self, other):定义 + 运算符行为。
__eq__(self, other):定义 == 运算符行为。
__lt__(self, other):定义 < 运算符行为。
__getitem__(self, key):定义索引访问 obj[key]
__setitem__(self, key, value):定义索引赋值 obj[key] = value

4. 上下文管理
__enter__(self):定义 with 语句的入口行为。
__exit__(self, exc_type, exc_val, exc_tb):定义 with 语句的退出行为。

5. 属性访问
__getattr__(self, name):访问不存在的属性时调用。
__setattr__(self, name, value):设置属性时调用。
__delattr__(self, name):删除属性时调用。

class Vector:
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2  # 隐式调用__add__
 
class Example:
    def __str__(self):
        return "字符串表示"

obj = Example()
print(obj.__str__())  # 可行但不推荐
print(str(obj))       # 正确触发__str__的方式
 

__new__ 是 Python 中用于创建实例的特殊方法,通常用于定制不可变类型或实现单例模式等场景。以下是关于 __new__ 的关键点:

def __new__(cls, *args, **kwargs):
    return super().__new__(cls, *args, **kwargs)
 
  • cls 表示当前类,由 Python 自动传入。
  • 必须返回一个实例对象(通常是父类的 __new__结果)。

对于不可变类型(如 intstrtuple),修改行为需在 __new__ 中实现,因为实例创建后无法修改。例如:

class PositiveInt(int):
    def __new__(cls, value):
        if value <= 0:
            raise ValueError("Value must be positive")
        return super().__new__(cls, value)
 

11.动态给实例添加属性与方法

动态给对象添加属性

class MyClass:
    pass

obj = MyClass()
obj.new_attribute = "value"  # 直接赋值添加属性
 

动态给类添加属性

class MyClass:
    pass

obj = MyClass()
obj.new_attr = "value"  # 动态添加实例属性
MyClass.class_attr = "class_value"  # 动态添加类属性
 
print(obj.class_attr) #"class_value" 

给实例添加普通方法

普通方法的第一个参数通常是 self,它代表类的实例。通过 self,方法可以访问实例的属性和其他方法。

class MyClass:
    def my_method(self, arg1, arg2):
        # 方法体
        return arg1 + arg2
 
class Person:
    def __init__(self,name = none):
        self.name = name


def eat():
    print("eating")

p1 = Person("zs")
p1.eat = eat #把函数赋值给p1的eat属性
p1.eat() #打印 eating

给实例添加实例方法

给对象添加的实例方法只绑定在当前对象上,不对其他对象生效,而且需要传入self参数,需要使用types.MethodType(方法名,实例对象)来添加实例方法

import types

class MyClass:
    pass

def custom_method(self, arg1, arg2):
    print(f"实例属性值: {self.attr}, 参数: {arg1}, {arg2}")

obj = MyClass()
obj.attr = "value"  # 添加实例属性
obj.dynamic_method = types.MethodType(custom_method, obj) #动态添加实例方法
obj.custom_method()
 

12.动态给类添加方法

给类添加的方法对他的对象都生效,添加类方法需要传入cls参数,添加静态方法则不需要

class Person:
    home = "earth"

    def __init__(self,name = none):
        self.name = name

#定义类方法
@classmethod
def come_from(cls):
    print(f"来自{cls.home}")

#定义静态方法
@staticmethod
def static_function():
    print("static function")

Person.come_from = come_from
person.static_function = static_function

#调用
Person.come_from()
Person.static_function()

13.动态删除属性和方法

del 对象.属性名

delatter(对象,属性名)

class Person:
    home = "earth"

    def __init__(self,name = none):
        self.name = name

P = Person("zs")
del p.name #此时p的这个name属性会被抹除 即没有name这个属性,p还在
del p #此时p不在了

14.__slots__限制实例属性与实例方法

python允许在定义类的时候,定义一个特殊的__slots__变量,来限制该类的实例能添加的属性。使用__slots__可以限制添加实例属性和实例方法,但类属性、类方法和静态方法还可以添加。__slots__仅对当前类生效,对子类无效。

class Person:
    __slots__ = ['name', 'age']

p = Person()
p.name = 'Alice'  # 允许
p.age = 25       # 允许
p.gender = 'F'   # 报错:AttributeError
 
class Calculator:
    __slots__ = ['value']

    def __init__(self, value):
        self.value = value

c = Calculator(10)
c.add = lambda x: x + c.value  # 报错:AttributeError
 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐