为什么我不能继承 python 中的地图?
Why I can't inherit map in python?
我想写一个自定义的class继承映射class。
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 中创建继承地图的 class?
或者为什么我不能继承 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))))
您不应该继承您正在包装的对象。那是因为您的 API 与该类型不同,并且没有好的方法可以确保您可以正确构建 class 的新实例。您的 map
情况就是一个例子,您的 __init__
期望的参数数量与 map.__new__
不同,并且没有好的方法来合理化它们。
不是从 class 继承,而是环绕它。这可能会限制可以使用的类型的 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)
我想写一个自定义的class继承映射class。
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 中创建继承地图的 class? 或者为什么我不能继承 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))))
您不应该继承您正在包装的对象。那是因为您的 API 与该类型不同,并且没有好的方法可以确保您可以正确构建 class 的新实例。您的 map
情况就是一个例子,您的 __init__
期望的参数数量与 map.__new__
不同,并且没有好的方法来合理化它们。
不是从 class 继承,而是环绕它。这可能会限制可以使用的类型的 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)