Python如何派生内置不可变类型并修改实例化行为
本文介绍如何在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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













