2016-06-30 34 views
0

如何使一類以下列方式返回一個對象:如何在類被初始化後引用類時返回對象?

import numpy as np 

a = np.array([(1,2),(3,4)]) 

每當a被引用,它返回

array([[1, 2], 
     [3, 4]]) 

然而,當我創建一個簡單的類:

class Example: 
    def __init__(self, data): 
     self.nparray = np.array(data) 

並運行b = Example([(1,2),(3,4)])然後參考b我得到:<__main__.Example at 0x7f17381099e8>。要返回我需要運行的值b.nparray

如何使課堂Example回報

array([[1, 2], 
     [3, 4]]) 

b被引用?

我嘗試使用方法,如__new__,__repr____getitem__但是沒有產生所需的行爲。

+0

_「每當'a'被調用時,它會返回...」_咦?它不會在我的機器上返回。當我執行你的第一個代碼塊然後執行'a()'時,我得到'TypeError:'numpy.ndarray'對象不可調用'。 – Kevin

+0

這不是什麼類,或什麼「呼叫」的意思。 – user2357112

+0

我不明白爲什麼人們都在低調投票 - OP對術語感到困惑。 **調用**意味着這個:'a()',但是當你說你「調用」'a'時,你的意思是你只是引用'a'。 –

回答

2

您應以下列方式使用__repr__

class Example: 
    def __init__(self, data): 
      self.nparray = np.array(data) 
    def __repr__(self): 
      return repr(self.nparray) 

這將返回表示內的self.nparray對象:

>>> c = Example([(1, 2), (3, 4)]) 
>>> c 
array([[1, 2], 
     [3, 4]]) 

當然,這是在交互式會話中使用下,你根本輸入名稱並按回車鍵,如果用print(c)打印。如果您需要限制爲print調用,則需要爲有問題的對象定義__str__

+1

謝謝!當我嘗試使用'__repr__'時,我錯過了'repr()'。 – Greg

2

使用Python的「魔術方法」,就像你已經看到的__init__一樣,當某些事情發生時,我們可以讓類執行代碼。其中之一是__call__,它在類被調用爲函數時執行。

知道了這一點,你可以使用此代碼:

import numpy as np 

class Example: 
    def __init__(self, data): 
     self.nparray = np.array(data) 

    def __call__(self): 
     # This function is called when an instance of Example is called 
     return self.nparray 

這樣做的結果是:

>>> b = Example([[1, 2], [3, 4]]) 
>>> b() 
array([[1, 2], 
     [3, 4]]) 

更多關於魔術方法,請參閱this useful article

+0

這很好,如果OP字面上調用他創建的示例實例,如'b = Example(...);打印(B())'。但我認爲OP使用的是一種不尋常的「呼叫」定義,這意味着更像「當我在交互式解釋器中自己在線上輸入'b'時」。所以他希望'b = Example(...);打印(b)'顯示陣列。 – Kevin

+0

@kevin沒錯。無論如何,我會留下答案給未來的Google員工。 –

+0

不幸的是'__call__'似乎不適用於numpy對象。它似乎仍然返回'<__ main __。例子在0x7fc23007f898>'。 – Greg

0

您不能從類init函數返回任何數據。你有沒有試過類似的東西:

class Example(object): 
    nparray = None 
    def __init__(self, data): 
     self.nparray = np.array(data) 
     return 

    def getArray(self): 
     return(self.nparray) 
+0

當a被引用時,它返回'<__ main __。0x7f2fdd455240的例子>'。 – Greg