2013-11-27 40 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