2013-11-27 3 views
1

Я как бы новичок в объектно-ориентированном программировании. Я просматриваю код, и есть часть, которую мне трудно понять. Я ценю, если вы можете мне помочь.Array in Python Объектно-ориентированный

У меня есть код, в котором у нас есть массив numpy, и тогда кажется, что «массив» используется как атрибут или метод для массива numpy, но я не уверен, как он работает. Ниже приведен синтаксис, что у меня есть:

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

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() [i]"? – Amir

+0

Извините за написание текстовой строки, но, пожалуйста, найдите минутку и прочитайте мой ответ @ user3040845 – Dunno

ответ

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 
1

Вам не нужно импортировать array, как это NumPy класс, и вы уже импортирования NumPy (и на самом деле вы называете массив с np.array).

После того, как у вас есть NumPy массив объектов можно получить доступ к элементам, используя квадратные скобки без каких-либо дополнительных примечаний:

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

Кроме того, чтобы получить доступ к атрибуту вашего класса вам нужно всего лишь использовать точечный синтаксис, я думаю, что ваш тест должен читать что-то вроде этого:

print a.price[1] 

(ред после О.П. разъяснений)

Если вы хотите быть в состоянии назвать 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

Да, но я хочу создать синтаксис, похожий на код, который я просматриваю: PromotionIdData.array() [ID, t] = ... – Amir

+0

Отредактировал свой ответ, чтобы указать ваше разъяснение – Javier