2013-11-27 43 views
1

我是面向對象編程中的一種新類型。我正在審查一個代碼,並且有一部分我很難理解。如果你能幫助我,我很感激。Python中的數組面向對象

我有一個代碼,其中我們有numpy數組,然後它看起來「數組」用作numpy數組的屬性或方法,但我不知道它是如何工作的。以下是我的語法:

self.PromotionIdData.array()[self.ID,T] = ...

PromotionIdData是一個二維陣列numpy的。 但我無法爲自己生成類似的syntex。這裏是我的代碼:

import numpy as np 
from array import * 
class test: 
    def __init__ (self): 
     self.price=np.array([10,20,30]) 
     self.cost=20 
     self.volum=2 

a=test() 
print getattr(a,'price').array[1] 

但我的代碼不起作用。我得到了錯誤,指出「數組」不是屬性。

感謝,

+0

查看'nparray.array()[i]'和'nparray.array [i]'之間的區別? – jazzpi

+0

能否請您給我「nparray.array()[我]」一些參考? – Amir

+0

對不起,編寫文本的一堵牆,但請花點時間閱讀我的回答@ user3040845 – Dunno

回答

0

的概念您的* test *類具有3個屬性:價格,成本和數量。

numpy模塊,或者爲了簡化,類,有它自己的屬性數組。

Numpy and test是單獨的類,你混淆它們。在您的__init__中,您可以調用函數np.array(),並將輸出分配給test.price。現在讓我們花一分鐘時間想一想test.price究竟分配了什麼。它不過是一個numpy數組,並且test.price的行爲與任何其他numpy數組的行爲完全相同。類和對象並非黑魔法:存儲在那裏的變量的行爲非常直觀!起初我也很難想象,所以我知道你的立場。 還有一件事要記住:類有自己的命名空間,這意味着test.var獨立於var,它們不以任何方式相互干擾。你將學會欣賞命名空間遲早;)

一對夫婦的例子:

def __init__(self): 
    dict={'a': 123} 
    list=[1,2,3,4] 
    var='spam' 
var='eggs and spam' 

>>>test.dict['a'] 
123 
>>>test.list[2] 
3 
>>>test.var 
spam 
>>>var 
eggs and spam 

至於你的self.PromotionIdData.array()[self.ID,t] = ... 這就是面向對象編程的一個高一點的水平例子。在類的定義裏面,你可以定義函數,或者說方法,並且按照你在你的例子中所做的方式來調用它們。像這樣:

class test(): 
    def array(self): #remember to always pass self to a function inside your class 
     return [1,2,3,4,5] 

>>>t=test() 
>>>t.array[2] 
3 
1

你並不需要導入array,因爲它是一個numpy的類,並且已導入numpy的(實際上是調用數組np.array)。

一旦你有一個numpy的數組對象,你可以訪問使用方括號中的元素,而無需任何附加說明:

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

此外,要訪問你的類的屬性,你只需要使用點語法,我想你的測試應該讀這樣的事情:

print a.price[1] 

(在OP澄清後可進行編輯)

如果你想能夠調用array()在你的類,你需要定義返回你想要的屬性的陣列的方法:

class test(): 
    def __init__(self): 
     self.price=np.array([10,20,30]) 
     self.cost=20 
     self.volum=2 

    def array(self): 
     return self.price 

那麼你可以做a.array()[1](請注意,您不需要明確標明價格屬性了)。對於這種類型的結構,您可能需要看看getters and setters

+0

是的,但我想產生類似我檢討的代碼了Syntex:PromotionIdData.array()[ID,T = ... – Amir

+0

編輯我的回覆以解決您的問題 – Javier