Я гугле кучу и не могу показаться, чтобы выяснить, как на самом деле это сделать:Как использовать функции модуля в классах Python
Учитывая У меня есть универсальный метод утилиты как так:
def __square(n):
return n*n
Тогда у меня есть некоторый класс, где я мог бы хотел использовать этот метод внутренне:
def __square(n):
return n*n
class Foo:
def __init__(self):
self.baz = 2
def bar(self):
return self.baz + __square(self.baz)
Ну, это не работает. Я получаю NameError '_Foo__square' is not defined
Почему?
В качестве обходного пути я в конечном итоге делает такие вещи, как это:
class Foo:
def __init__(self):
self.baz = 2
def bar(self):
return baz + self.square(self.baz)
def square(self,n):
return n*n
Но что чувствует себя глупо для меня, потому что площадь функция не имеет ничего общего с экземпляром Foo, ни бы я ожидал или хотите быть методом на экземплярах Foo.
Что такое «питонический» способ справиться с такими вещами?
EDIT
я понял, по крайней мере, одну часть этого: я получаю это поведение, потому что я думаю, что эти методы полезности, как частные, и я называть их как def __square(n):
.
Я не осознавал, что это было особенным, и, набрав пример выше, я изначально не набирал его таким образом. Теперь я отредактировал вопрос, чтобы понять, как он был набран.
Итак, теперь мой вопрос: почему ставит __
перед методом верхнего уровня, сломайте его или, похоже,? Я понял, что это соглашение для обозначения «личных вещей» в Python, поскольку в этом случае он не работает, что бы вы рекомендовали вместо этого?
Где находится 'square' в относительной структуре файлов? – kojiro
Не удалось воспроизвести. Первые фрагменты работают так же хорошо для меня как в 2.7, так и в 3.5. –
Я получаю это, когда у меня есть функции, определенные в одном файле, несколько строк. Использование Python 3.5 – Andrew