为什么我不能在python中继承映射?

2024-09-30 08:21:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想编写一个自定义类来继承map类

class mapT(map):
def __init__(self,iii):
    self.obj = iii

但是我不能初始化它

# Example init object
ex = map(None,["","1","2"])

exp1 = mapT(ex)
# TypeError: map() must have at least two arguments.

exp1 = mapT(None,ex)
# TypeError: __init__() takes 2 positional arguments but 3 were given

如何在python中创建继承映射的类? 或者为什么我不能在python中继承映射

====添加=====

我想要实现的是为可迭代对象添加自定义方法

def iterZ(self_obj):
    class iterC(type(self_obj)):
        def __init__(self,self_obj):
            super(iterC, self).__init__(self_obj)
            self.obj = self_obj
        def map(self,func):
            return iterZ(list(map(func,self.obj))) # I want to remove "list" here, but I can't. Otherwise it cause TypeError
        def filter(self,func):
            return iterZ(list(filter(func,self.obj))) # I want to remove "list" here, but I can't. Otherwise it cause TypeError
        def list(self):
            return iterZ(list(self.obj))
        def join(self,Jstr):
            return Jstr.join(self)
return iterC(self_obj)

这样我就可以做到:

a = iterZ([1,3,5,7,9,100])
a.map(lambda x:x+65).filter(lambda x:x<=90).map(lambda x:chr(x)).join("")
# BDFHJ

与此相反:

"".join(map(lambda x:chr(x),filter(lambda x:x<=90,map(lambda x:x+65,a))))

Tags: lambdaselfobjmapreturninitdeffilter
1条回答
网友
1楼 · 发布于 2024-09-30 08:21:45

您不应该从正在包装的对象继承。这是因为您的API与该类型不同,并且没有好的方法确保您可以正确地构建该类的新实例。您的map情况就是一个例子,您的__init__期望的参数数量与map.__new__不同,并且没有好的方法使它们合理化

与其从类继承,不如围绕它。这可能会限制可以使用的类型的API,但您主要关注迭代器协议,因此__iter____next__可能就是您所需要的:

class iterZ:
    def __init__(self, iterable):
        self.iterator = iter(iterable)

    def __iter__(self):
        return self

    def __next__(self):
        return next(self.iterator)

    def map(self,func):
        return iterZ(map(func,self.iterator))

    def filter(self,func):
        return iterZ(filter(func,self.iterator))

    def join(self,Jstr):
        return Jstr.join(self.iterator)

相关问题 更多 >

    热门问题