2013-03-05 84 views
1

我有一个numpy.ndarray的子​​类,它修改了逐项索引的行为。但是,当有人在我的子类上打印时,我想保留原始的ndarray输出格式。我试着覆盖__iter__函数,但似乎没有工作。假设__getitem__被重载,是否有可能在底层数组中排序输出数字?我应该重载哪些功能来定制打印输出?

import numpy as np 

class imarray(np.ndarray): 
    def __new__(cls, d, f): 
     nd = np.asarray(d) 
     return super(imarray, cls).__new__(cls,(nd.size,), dtype=nd.dtype, buffer=nd).view(imarray) 
    def __init__(self, d, f): 
     self.f = f 
    def __array_finalize__(self, o): 
     pass 
    def __getitem__(self, i): 
     return super(imarray, self).__getitem__(self.f(i)) 
    def __setitem__(self, i, y): 
     return super(imarray, self).__setitem__(self.f(i), y) 
    def __iter__(self): 
     return super(imarray, self).__iter__ 

if __name__ == "__main__": 
    a = imarray([1., 2., 3.1415], lambda i:i+1) 
    print a[0] # print .2 
    a[-1] =.4 
    print a[-1] # print .4 
    print a # print [ 2. 3.1415 0.4 ] but want [ 0.4 2. 3.1415 ] 

回答

2

打印返回对象__str__方法。因此你需要ovveride __str__

>>> class ex(): 
    def __init__(self, value): 
     self.val = value 
    def __str__(self): 
     return self.val * 2 


>>> a = ex('A') 
>>> print a 
AA 
1

它实际上取决于。

如果您打印一个对象,print将调用它的__str__方法。

但是,如果打印list(或setdict),print将调用列表的__str__方法,这反过来将调用项目__repr__方法。它很奇怪,但很容易观察到:

>>> class B(): 
...  def __repr__(self): return '__repr__' 
...  def __str__(self): return '__str__' 
... 
>>> print B() 
__str__ 
>>> print [B()] 
[__repr__] 
>>> print set([B()]) 
set([__repr__]) 
>>> print {B(): B()} 
{__repr__: __repr__} 
+0

,@ InbarRose:\ __ str__和\ __ repr__不会将索引作为参数。所以我不知道如何修改打印行为。例如。我假定通过数组中的元素打印循环从0到N.在上面的例子中,我需要它显示元素,就好像从-1循环到N-1一样。所以我没有看到\ __ str__和\ __ repr__如何解决这个问题。也许我误解了一些东西? – Gary 2013-03-05 11:51:58