我是面向对象编程的新手。我正在审查代码,有一部分我很难理解。如果你能帮助我,我很感激。
我有一个代码,其中我们有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 :(得分: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
答案 1 :(得分:0)
您的* test *类有3个属性:价格,成本和数量。
Numpy 模块,或简化类,有自己的属性数组。
Numpy 和 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