python高级(如何派生内置不可变类型并修改其实例化行为)

案例:

我们想自定义一种新类型的元组,对于传入的可迭代对象,我们只保留作其中int类型且值大于0的元素,例如:

intTuple([1,-1,'abc',6,['x','y'],3)b => (1,6,3)

要求intTuple是内置tuple的子类,如何实现?

 

重写__new__类方法,new方法是对参数进行实例操作,在此之间,对实例参数进行预操作,修改实例化行为

class IntTuple(tuple):    #自定义一个类,继承tuple元组类
    def __new__(cls, iterable):    #new方法是在init方法之前进行调用的方法,作用是为对象分配内存空间并返回对象的引用
        g = (x for x in iterable if isinstance(x,int) and x > 0)      # 定义一个生成式,写条件过滤掉不符合的元素
        return super(IntTuple, cls).__new__(cls, g)   #super方法继承本类,cls代表当前intTuple类本身,把参数变成生成式,返回给这个类本身的__new__方法

    def __init__(self,iterable):     #此时iterable引用了被__new__类方法修改过的实例参数
        pass

if __name__ == '__main__':
    t = IntTuple([1,-1,'abc',6,['x','y'],3])
    print(t)    #打印(1,6,3)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值