Python在__new__方法中检查迭代
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python在__new__方法中检查迭代,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2800字,纯文字阅读大概需要5分钟。
内容图文
![Python在__new__方法中检查迭代](/upload/InfoBanner/zyjiaocheng/785/0338fc6aba284a629bc445988803a1c9.jpg)
我正在尝试编写一个python(2.7)矩阵模块. (我知道numpy,这只是为了好玩.)
我的代码:
from numbers import Number
import itertools
test2DMat = [[1,2,3],[4,5,6],[7,8,9]]
test3DMat = [[[1,2,3],[4,5,6],[7,8,9]],[[2,3,4],[5,6,7],[8,9,0]],[[9,8,7],[6,5,4],[3,2,1]]]
class Dim(list):
def __new__(cls,inDim):
# If every item in inDim is a number create a Vec
if all(isinstance(item,Number) for item in inDim):
#return Vec(inDim)
return Vec.__new__(cls,inDim)
# Otherwise create a Dim
return list.__new__(cls,inDim)
def __init__(self,inDim):
# Make sure every item in inDim is iterable
try:
for item in inDim: iter(item)
except TypeError:
raise TypeError('All items in a Dim must be iterable')
# Make sure every item in inDim has the same length
# or that there are zero items in the list
if len(set(len(item) for item in inDim)) > 1:
raise ValueError('All lists in a Dim must be the same length')
inDim = map(Dim,inDim)
list.__init__(self,inDim)
class Vec(Dim):
def __new__(cls,inDim):
if cls.__name__ not in [Vec.__name__,Dim.__name__]:
newMat = list.__new__(Vec,inDim)
newMat.__init__(inDim)
return newMat
return list.__new__(Vec,inDim)
def __init__(self,inDim):
list.__init__(self,inDim)
class Matrix(Dim):
def __new__(cls,inMat):
return Dim.__new__(cls,inMat)
def __init__(self,inMat):
super(Matrix,self).__init__(inMat)
目前的功能:
到目前为止,我已经写了几个类,Matrix,Dim和Vec. Matrix和Vec都是Dim的子类.在创建矩阵时,首先会从列表列表开始,然后创建一个矩阵,如:
>>> startingList = [[1,2,3],[4,5,6],[7,8,9]]
>>> matrix.Matrix(startingList)
[[1,2,3],[4,5,6],[7,8,9]]
这应该创建一个矩阵.创建的Matrix应包含多个相同长度的Dims.这些Dims中的每一个都应该包含多个相同长度的Dims等.最后一个Dim,包含数字的Dim,应该只包含数字,应该是Vec而不是Dim.
问题:
所有这些都适用于列表.但是,如果我使用迭代器对象(例如iter()返回的对象),则这不会像我想要的那样起作用.
例如:
>>> startingList = [[1,2,3],[4,5,6],[7,8,9]]
>>> matrix.Matrix(iter(startingList))
[]
我的想法:
我很确定这种情况正在发生,因为在Dim .__ new__中我迭代输入迭代,当相同的iterable随后传递给Matrix .__ init__时,它已经被迭代,因此看起来是空的,导致我得到的空矩阵.
我曾尝试使用itertools.tee()复制迭代器,但这也行不通,因为我实际上并没有调用Matrix .__ init__当Matrix .__ new__返回时它会被隐式调用,因此我不能用不同的参数调用它.传递给Matrix .__ init__.我想到的所有事情都会遇到同样的问题.
有没有办法让我保留现有的功能,并允许使用迭代器对象调用matrix.Matrix()?
解决方法:
关键是Vec .__ init__被调用两次;一旦进入你的__new__方法,一旦你从__new__方法返回它.因此,如果您将其标记为已初始化并从Vec .__ init__提前返回(如果已初始化),则可以忽略第二个调用:
class A(object):
def __new__(cls, param):
return B.__new__(cls, param + 100)
class B(A):
def __new__(cls, param):
b = object.__new__(B)
b.__init__(param)
return b
def __init__(self, param):
if hasattr(self, 'param'):
print "skipping __init__", self
return
self.param = param
print A(5).param
内容总结
以上是互联网集市为您收集整理的Python在__new__方法中检查迭代全部内容,希望文章能够帮你解决Python在__new__方法中检查迭代所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。