2013-08-04 2 views
1

Я новичок в Python, и я сталкиваюсь с некоторыми проблемами, когда речь идет о частных функциях. Я хочу вызвать два из них в публичном методе, просто для того, чтобы сделать код понятным, но я не могу понять вообще, что показывает ошибка времени выполнения. Вот проблематичной частью полного кода:Как правильно использовать частные функции в Python?

def __loadVec(self,vec,res): 
    for i in range(0,res.getRows()): 
     for j in range(0,res.getColumns()): 
      vec.append(self.matrix[i][j]) 
    return 

def __savetoMatrix(self,vec,res): 
    index = 0 
    for i in range(0,res.getRows()): 
     for j in range(0,res.getColumns()): 
      self.matrix[i][j] = vec[index] 
      index += 1 
    return 

def fmatrixSort(self,res): 
    try: 
     print "Sorting matrix information..." 
     vec = [] 
     self._matrix.__loadVec(vec,res) 
     vec.sort() 
     self_matrix.__savetoMatrix(vec,res) 
    except TypeError: 
     print "TypeError in fmatrixSort"    
    return 

То, что я пытаюсь сделать, это полностью организовать матрицу так, как он начинает с наименьшим значением и заканчивается самым высоким.

Это ошибка программы показывает:

Traceback (most recent call last): 
    File "MatrixClass.py", line 211, in <module> 
    main() 
    File "MatrixClass.py", line 203, in main 
    mat.fmatrixSort(res) 
    File "MatrixClass.py", line 154, in fmatrixSort 
    self._matrix.__loadVec(vec,res) 
AttributeError: matrix instance has no attribute '_matrix' 

Как мне это исправить?

+0

Не используйте class-private '__identifiers' в Python. Они существуют по совершенно другой причине, чем частные члены в Java/C++ и не являются их заменой. – msw

+0

ваш код borken, что такое 'self_matrix'; также ваша проблема не вызвана из-за __methods, но отсутствует атрибут self._matrix! –

ответ

2

У Python не совсем есть концепция функций private. Тем не менее, он обрабатывает атрибуты класса, имена которых начинаются как минимум с двух нижних панелей и заканчиваются не более чем одним нижним ящиком немного - это изменяет имена, чтобы сделать их немного сложнее для доступа. В этом примере вы можете видеть, что функция __func2 имеет свое имя. Это по-прежнему можно получить доступ и вызов функции - но вы должны приложить особые усилия, чтобы сделать это, просто вызвав o.func2() терпит неудачу:

[email protected]:tmp$cat test.py 

class myclass: 

    def func1(self): 
     print "one" 

    def __func2(self): 
     print "two" 

o = myclass() 

print dir(o) 

o._myclass__func2() 
o.func2() 
[email protected]:tmp$python test.py 
['__doc__', '__module__', '_myclass__func2', 'func1'] 
two 
Traceback (most recent call last): 
    File "test.py", line 15, in <module> 
    o.func2() 
AttributeError: myclass instance has no attribute 'func2' 
[email protected]:tmp$ 

Так, чтобы ответить на вопрос, который вы просили:

Как вы правильно используете частные функции в Python?

Ответ: как и любая другая функция, но вы должны знать об извращенном имени.

Переходя к вопросу, который вы хотели спросить:

AttributeError: matrix instance has no attribute '_matrix' 

Это идет из линии 154:

self._matrix.__loadVec(vec,res) 

Сообщение об ошибке говорит вам о том, что объект под названием self является экземпляром класс matrix; но у него нет атрибута _matrix.Ссылаясь на __savetoMatrix функции выше, это выглядит как атрибут называется просто matrix - так что вам необходимо обратиться к нему как self.matrix ("атрибут называется matrix объекта под названием self)

этого __savetoMatrix функции ссылка self.matrix скорее. . чем self._matrix

Однако, есть более глубокая проблема здесь Чтение между строк, это выглядит, как будто этот код приходит из класса под названием matrix;.. и экземпляры класса имеют атрибут называется matrix При вызове self.matrix.__loadVec(), вы вызов функции называемый __loadvec(), который связан с атрибутом matrix, связанным с объектом, называемым self.

Даже если это то, что вы хотите сделать, это не будет работать из-за названия коверкая, как описано выше, - при условии, что атрибут называется matrix имеет класс inner_matrix, вы должны вызвать функцию self._matrix._inner_matrix__loadVec()

I думаю что то, что вы на самом деле пытаетесь сделать, это вызвать метод, называемый __loadVec(), определенный в классе matrix. Для этого вам просто нужно позвонить self.__loadVec(). Поскольку это вызов функции внутри одного и того же класса, вам даже не нужно беспокоиться о механизме имени - эти функции предназначены для использования внутри класса, и интерпретатор будет обрабатывать вас.

[email protected]:tmp$cat test.py 

class myclass: 

    def func1(self): 
     print "one" 

    def __func2(self): 
     print "two" 

    def func3(self): 
     self.__func2() 
     print "three" 

o = myclass() 
print dir(o) 
o.func3() 
[email protected]:tmp$python test.py 
['__doc__', '__module__', '_myclass__func2', 'func1', 'func3'] 
two 
three 
+0

Спасибо Джеймс, он отлично работал –

+0

Вы сказали: «У Python не совсем есть концепция частных функций». и это было бы гораздо лучшим ответом, если бы вы остановились там. – msw

+0

Не согласен; Основной вопрос Джулиана не имел ничего общего с частными функциями, это было просто отвлечением, которое нужно было решать, чтобы мы могли справиться с реальными проблемами. –

2

Вы перепутали self.matrix, self._matrix и self_matrix в нескольких частях вашего кода. Скорее всего, вы имели в виду self.matrix или self._matrix, а остальные - опечатки. Кроме того, fmatrixSort должен, вероятно, звонить __loadVec и __savetoMatrix на self вместо того, что он делает в настоящее время.

Дополнительные примечания:

Вам не нужно return в конце функции, если вы не имеете значения для возврата. Когда выполнение попадает в конец функции, функция возвращается автоматически.

range можно назвать 3 способами:

range(stop) 
range(start, stop) 
range(start, stop, step) 

Если вы собираетесь начать диапазон на 0, просто оставьте из параметра start и вызвать range с 1 аргументом.

+0

Спасибо, я не понимал, что могу это сделать –

Смежные вопросы