Python如何派生内置不可变类型并修改实例化行为

林见深
林见深
发布时间:2026-10-14| 3人浏览过
原创

本文介绍如何在Python中派生内置不可变类型(如tuple)并修改其实例化行为。通过继承tuple类并重写__new__方法,可以在实例创建前对输入数据进行预处理,例如过滤非整数或负数元素。文章提供了具体代码示例,展示如何自定义IntTuple类,仅保留大于0的整数元素,并解释了__new__与__init__的执行顺序及关键点。

Python派生不可变类型并修改实例化行为

本文分享了一个Python实现示例,演示如何派生内置不可变类型并修改其实例化行为,供读者参考。

具体案例如下:

目标是自定义一个元组子类,对传入的可迭代对象进行过滤,仅保留其中的整数类型且值大于0的元素。例如,输入列表为[1, -2, 'xxx', 7, [1, 'oo'], 9]时,期望输出结果为(1, 7, 9)。

[1, -2, 'xxx', 7, [1, 'oo'], 9] >> (1, 7, 9)

实现思路如下:

1. 自定义一个类,继承自tuple类。 2. 重写__new__方法。作为类方法,__new__负责处理参数并创建实例。在此方法中,可以对传入的参数进行预处理,从而修改实例化行为(注意:__new__方法的执行先于__init__方法)。 3. 在重写的__new__方法中,将参数转换为生成器表达式,并返回本类的实例。


#!/usr/bin/python3
 
 
class IntTuple(tuple):
  def __new__(cls, iterable):
    # new方法是init方法之前进行调用的方法
    # 生成一个生成式
    g = (x for x in iterable if isinstance(x, int) and x > 0)
     
    # cls为这个类本身,把参数g交给这个类本身
    return super(IntTuple, cls).__new__(cls, g)
 
  def __init__(self, iterable):
    pass
     
     
if __name__ == "__main__":
  l = [1, -2, 'xxx', 7, [1, 'oo'], 9]
   
  result = IntTuple(l)
  print(result)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。