PythonStudy

2025年4月27日

通过CI自动出包的py脚本学习出包流程以及py

在 Python 中,__init__() 是一个特殊的双下划线方法(也称为魔法方法特殊方法),它是类的构造函数(constructor)。下面详细解释它的作用和用法:


一、__init__() 的作用

  1. 初始化对象

    • 当创建类的实例(对象)时,__init__() 会被自动调用。
    • 用于为对象设置初始状态(如初始化属性、绑定数据等)。
  2. 接受参数

    • 可以定义参数,在创建对象时传入初始值。
    • 例如:创建一个 Person 对象时,传入姓名和年龄。
  3. 非必须但常用

    • 如果类中没有定义 __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)  # 输出: 白色(使用默认值)

四、注意事项

  1. self 不可省略

    • 必须显式声明 self,否则会报错。
  2. 无返回值

    • __init__() 不应返回任何值(包括 None),它的作用是修改对象状态,而不是返回值。
  3. __new__() 的区别

    • __new__() 负责创建对象(分配内存),__init__() 负责初始化对象。
    • 日常开发中通常只需定义 __init__()

五、与其他语言对比

  • 类似 Java/C++ 的构造函数
    • Python 的 __init__() 类似于其他语言中的构造函数,但语法更简洁。
    • 例如 Java:
      public class Dog {
          private String name;
          public Dog(String name) {  // 构造函数
              this.name = name;
          }
      }
      

六、高级用法

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 中类的核心方法,用于:

  1. 在对象创建时初始化属性。
  2. 接受外部参数,定义对象初始状态。
  3. 通过 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代码,并重点解析核心知识点:

  1. 基础结构
import re
from pathlib import Path
  • import:Python的模块导入语句
  • re:正则表达式模块,用于模式匹配
  • pathlib:现代文件路径处理模块(推荐替代旧的os.path)
  1. 函数定义
def process_folder(folder_path):
    """处理文件夹内所有.gscn文件,每个文件独立去重"""
    # 函数体
  • def:函数定义关键字
  • 文档字符串:三引号内的函数说明
  • 参数:单个位置参数 folder_path
  1. 路径验证
folder = Path(folder_path)
if not folder.exists() or not folder.is_dir():
  • Path 对象:面向对象的路径操作
  • exists():检查路径存在性
  • is_dir():验证是否为目录
  1. 文件遍历
gscn_files = list(folder.glob("*.gscn"))
  • glob():模式匹配文件查找
  • *.gscn:匹配扩展名为.gscn的文件
  1. 核心正则表达式
pattern = re.compile(
    r"[\\/]([^\\/]+\.(?:gwm|mat))",
    re.IGNORECASE
)
  • [\\/]:匹配\或/路径分隔符
  • ([^\\/]+:捕获非分隔符字符直到扩展名前
  • (?:):非捕获分组,仅用于分组不影响捕获
  • re.IGNORECASE:忽略大小写匹配
  1. 多编码文件读取
for encoding in ['utf-8', 'gbk', 'latin-1']:
    try:
        with open(...) as f:
            # 读取操作
        break  # 成功则跳出循环
    except (...):
        continue
  • with:上下文管理器,自动处理文件关闭
  • 异常处理:尝试不同编码解决乱码问题
  • 编码尝试顺序:UTF-8 → GBK → Latin-1
  1. 数据结构应用
gwm_set = set()
mat_set = set()
results = {
    str(file_path): (
        sorted(gwm_set),
        sorted(mat_set)
    )
}
  • set:自动去重的无序集合
  • sorted():返回排序后的列表
  • 字典存储:结构化存储处理结果
  1. 输出格式化
print(f"\n file:{Path(file_path).name}")
print('    ' + '\n    '.join(gwm_files) if gwm_files else '    (none)')
  • f-string:Python 3.6+ 的格式化字符串
  • 三元表达式:条件判断简写形式
  • join():列表转字符串连接操作
  1. 代码结构分析
  • 输入 → 处理 → 输出的典型数据处理流程
  • 模块化设计:核心逻辑封装在函数中
  • 配置与逻辑分离:路径设置与业务代码分离
  1. 关键编程技巧
  • 防御性编程:检查路径有效性
  • 错误容忍:多编码尝试机制
  • 高效去重:集合数据结构应用
  • 可维护性:使用Pathlib代替字符串拼接路径
  1. 扩展学习点
# 类似接口设计示例
def process_file(file_path, pattern):
    """通用文件处理函数"""
    # 实现读取、匹配、返回结果

# 使用示例
results = {}
for file in folder.glob("*.gscn"):
    results[file.name] = process_file(file, pattern)
  1. 代码优化方向
  • 添加类型注解(Python 3.5+)
  • 使用yield实现生成器逐步处理
  • 添加多线程/异步处理提升性能
  • 输出结果到CSV/Excel文件

通过这个代码示例,可以学习到:

  • 文件系统操作(Pathlib)
  • 文本模式匹配(re)
  • 异常处理机制
  • 数据结构选择(set/dict)
  • 编码问题处理
  • 函数封装技巧

建议练习:

  1. 修改正则表达式匹配其他扩展名
  2. 添加统计总文件数的功能
  3. 将结果输出到JSON文件
  4. 实现递归子目录查找功能
posted @ 2025-04-09 10:53  無碍  阅读(52)  评论(0)    收藏  举报