2014-02-04 7 views
6

Я работаю над проектом, использующим sython python для Google App Engine. Я рылся в нем и видел много таких методов.Назначение переменной частному методу

def _put(self, bla, bla): 
    do something 
put = _put 

Есть ли причина, по которой они назначают частную переменную? Я имею в виду, что я не вижу смысла определять метод как частный, а затем назначая его не private-переменной. Почему бы просто не сделать этот метод своей публикой?

def put(self, bla, bla): 
    do something 

Только тогда я могу подумать, что это делается таким образом, чтобы соответствовать правилам «правильного стиля кодирования». Я в основном интересовался тем, что хотел бы лучше писать правильный код на Python и хотел бы знать, нужно ли мне это делать самому?

EDIT: Спасибо @falsetru за ссылку! Вот что я говорю о (https://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/ndb/model.py?r=410#3340)

+0

Выглядит довольно бесполезно для меня. – FogleBird

+1

У Python действительно нет частных и общедоступных методов. Подчеркивание - это просто конвенция. – Chris

+0

Возможный дубликат [Есть ли у python «частные» переменные в классах?] (Http://stackoverflow.com/questions/1641219/does-python-have-private-variables-in-classes) –

ответ

3

Guido's explanation для этой модели в коде НБД:

NDB имеет другое правило для публичных и защищенных имен. Многие (но не все) имена, начинающиеся с подчеркивания, фактически считаются общедоступными API-интерфейсами, потому что мы не хотим резервировать их имена методов как имена свойств. Мы просто псевдоним более удобных для пользователя имен меньшего размера для удобства (например, реальный метод - _put(), и вы действительно должны его использовать, но мы позволяем вам использовать put(), если у вас нет свойства с именем 'положил').

+0

Удивительно, это очень хорошо. – amiller2571

2

только один (немного) разумно целью сделать это является закрытие:

def wrapper(): 
    x = 2 
    def _put(self, bla, bla): 
     return x + 2 

    self.put = _put 
+0

В Python нет ключевого слова' var', но 'nonlocal' (только для Python 3.x). – falsetru

+0

Спасибо за уведомление, исправлено. – IProblemFactory

+2

Я делаю это все время :), идущий туда-сюда между python и JavaScript, иногда запутывается – amiller2571

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