PythonStudy
2025年4月27日
通过CI自动出包的py脚本学习出包流程以及py
在 Python 中,__init__() 是一个特殊的双下划线方法(也称为魔法方法或特殊方法),它是类的构造函数(constructor)。下面详细解释它的作用和用法:
一、__init__() 的作用
-
初始化对象:
- 当创建类的实例(对象)时,
__init__()会被自动调用。 - 用于为对象设置初始状态(如初始化属性、绑定数据等)。
- 当创建类的实例(对象)时,
-
接受参数:
- 可以定义参数,在创建对象时传入初始值。
- 例如:创建一个
Person对象时,传入姓名和年龄。
-
非必须但常用:
- 如果类中没有定义
__init__(),Python 会提供一个默认的空实现。 - 但大多数情况下,我们需要自定义
__init__()来初始化对象。
- 如果类中没有定义
二、基本语法
class MyClass:
def __init__(self, 参数1, 参数2, ...):
# 初始化代码
self.属性1 = 参数1
self.属性2 = 参数2
-
self参数:- 必须作为第一个参数,表示类的实例自身。
- 通过
self.属性名绑定属性到对象。
-
其他参数:
- 可自定义参数,创建对象时需传入(除非有默认值)。
三、示例代码
1. 简单初始化
class Dog:
def __init__(self, name, age):
self.name = name # 绑定属性到对象
self.age = age
# 创建对象时,自动调用 __init__
my_dog = Dog("Buddy", 3)
print(my_dog.name) # 输出: Buddy
print(my_dog.age) # 输出: 3
2. 带默认值的参数
class Car:
def __init__(self, brand, color="白色"):
self.brand = brand
self.color = color
my_car = Car("比亚迪")
print(my_car.color) # 输出: 白色(使用默认值)
四、注意事项
-
self不可省略:- 必须显式声明
self,否则会报错。
- 必须显式声明
-
无返回值:
__init__()不应返回任何值(包括None),它的作用是修改对象状态,而不是返回值。
-
与
__new__()的区别:__new__()负责创建对象(分配内存),__init__()负责初始化对象。- 日常开发中通常只需定义
__init__()。
五、与其他语言对比
- 类似 Java/C++ 的构造函数:
- Python 的
__init__()类似于其他语言中的构造函数,但语法更简洁。 - 例如 Java:
public class Dog { private String name; public Dog(String name) { // 构造函数 this.name = name; } }
- Python 的
六、高级用法
1. 继承中的 __init__()
子类需要显式调用父类的 __init__()(如需继承父类属性):
class Animal:
def __init__(self, species):
self.species = species
class Cat(Animal):
def __init__(self, species, name):
super().__init__(species) # 调用父类 __init__
self.name = name
my_cat = Cat("猫", "Tom")
print(my_cat.species) # 输出: 猫
2. 动态属性初始化
class Config:
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value) # 动态设置属性
config = Config(api_key="123", timeout=30)
print(config.api_key) # 输出: 123
总结
__init__() 是 Python 中类的核心方法,用于:
- 在对象创建时初始化属性。
- 接受外部参数,定义对象初始状态。
- 通过
self绑定数据到对象。
它是面向对象编程中封装数据的关键一步。
import re
from pathlib import Path
def process_folder(folder_path):
"""处理文件夹内所有.gscn文件,每个文件独立去重"""
folder = Path(folder_path)
if not folder.exists() or not folder.is_dir():
print(f"错误:路径 '{folder_path}' 不存在或不是文件夹")
return
# 获取所有.gscn文件
gscn_files = list(folder.glob("*.gscn"))
if not gscn_files:
print(f"文件夹 '{folder_path}' 中未找到.gscn文件")
return
# 存储结果:{ 文件路径 : (gwm列表, mat列表) }
results = {}
# 正则模式:匹配任意路径层级的.gwm/.mat文件名
pattern = re.compile(
r"[\\/]([^\\/]+\.(?:gwm|mat))", # 捕获最后一个斜杆后的文件名
re.IGNORECASE
)
for file_path in gscn_files:
gwm_set = set()
mat_set = set()
# 尝试多种编码
encodings = ['utf-8', 'gbk', 'latin-1']
for encoding in encodings:
try:
with open(file_path, 'r', encoding=encoding) as f:
for line in f:
matches = pattern.findall(line)
for filename in matches:
if filename.lower().endswith('.gwm'):
gwm_set.add(filename)
elif filename.lower().endswith('.mat'):
mat_set.add(filename)
break # 成功读取后跳出编码循环
except (UnicodeDecodeError, OSError):
continue
# 保存结果(按文件名排序)
results[str(file_path)] = (
sorted(gwm_set),
sorted(mat_set)
)
return results
# ================== 手动修改这里设置路径 ==================
input_folder = r"C:\\HUB" # ← 修改为你的实际路径
# ========================================================
# 处理文件并获取结果
results = process_folder(input_folder)
# 输出结果
if results:
print("\n" + "="*50)
for file_path, (gwm_files, mat_files) in results.items():
print(f"\n file:{Path(file_path).name}")
print(f" → .gwm file ({len(gwm_files)}个):")
print(' ' + '\n '.join(gwm_files) if gwm_files else ' (none)')
print(f" → .mat file ({len(mat_files)}个):")
print(' ' + '\n '.join(mat_files) if mat_files else ' (none)')
print("="*50 + "\n")
好的,我将从基础到进阶逐步讲解这段Python代码,并重点解析核心知识点:
- 基础结构
import re
from pathlib import Path
import:Python的模块导入语句re:正则表达式模块,用于模式匹配pathlib:现代文件路径处理模块(推荐替代旧的os.path)
- 函数定义
def process_folder(folder_path):
"""处理文件夹内所有.gscn文件,每个文件独立去重"""
# 函数体
def:函数定义关键字- 文档字符串:三引号内的函数说明
- 参数:单个位置参数 folder_path
- 路径验证
folder = Path(folder_path)
if not folder.exists() or not folder.is_dir():
Path对象:面向对象的路径操作exists():检查路径存在性is_dir():验证是否为目录
- 文件遍历
gscn_files = list(folder.glob("*.gscn"))
glob():模式匹配文件查找*.gscn:匹配扩展名为.gscn的文件
- 核心正则表达式
pattern = re.compile(
r"[\\/]([^\\/]+\.(?:gwm|mat))",
re.IGNORECASE
)
[\\/]:匹配\或/路径分隔符([^\\/]+:捕获非分隔符字符直到扩展名前(?:):非捕获分组,仅用于分组不影响捕获re.IGNORECASE:忽略大小写匹配
- 多编码文件读取
for encoding in ['utf-8', 'gbk', 'latin-1']:
try:
with open(...) as f:
# 读取操作
break # 成功则跳出循环
except (...):
continue
with:上下文管理器,自动处理文件关闭- 异常处理:尝试不同编码解决乱码问题
- 编码尝试顺序:UTF-8 → GBK → Latin-1
- 数据结构应用
gwm_set = set()
mat_set = set()
results = {
str(file_path): (
sorted(gwm_set),
sorted(mat_set)
)
}
set:自动去重的无序集合sorted():返回排序后的列表- 字典存储:结构化存储处理结果
- 输出格式化
print(f"\n file:{Path(file_path).name}")
print(' ' + '\n '.join(gwm_files) if gwm_files else ' (none)')
- f-string:Python 3.6+ 的格式化字符串
- 三元表达式:条件判断简写形式
join():列表转字符串连接操作
- 代码结构分析
- 输入 → 处理 → 输出的典型数据处理流程
- 模块化设计:核心逻辑封装在函数中
- 配置与逻辑分离:路径设置与业务代码分离
- 关键编程技巧
- 防御性编程:检查路径有效性
- 错误容忍:多编码尝试机制
- 高效去重:集合数据结构应用
- 可维护性:使用Pathlib代替字符串拼接路径
- 扩展学习点
# 类似接口设计示例
def process_file(file_path, pattern):
"""通用文件处理函数"""
# 实现读取、匹配、返回结果
# 使用示例
results = {}
for file in folder.glob("*.gscn"):
results[file.name] = process_file(file, pattern)
- 代码优化方向
- 添加类型注解(Python 3.5+)
- 使用yield实现生成器逐步处理
- 添加多线程/异步处理提升性能
- 输出结果到CSV/Excel文件
通过这个代码示例,可以学习到:
- 文件系统操作(Pathlib)
- 文本模式匹配(re)
- 异常处理机制
- 数据结构选择(set/dict)
- 编码问题处理
- 函数封装技巧
建议练习:
- 修改正则表达式匹配其他扩展名
- 添加统计总文件数的功能
- 将结果输出到JSON文件
- 实现递归子目录查找功能

浙公网安备 33010602011771号