Почему я не могу вызвать приватный метод, когда я нахожусь внутри публичного метода? - PullRequest
6 голосов
/ 04 февраля 2011

У меня есть следующий код:

class MyClass:
    def __private(self):
        print "Hey man! This is private!"

    def public(self):
        __private()
        print "I don't care if you see this!"

if __name__ == '__main__':
    x = MyClass()
    x.public()

Однако это дает мне следующую ошибку:

NameError: global name '_MyClass__private' is not defined

Что я делаю не так?

Ответы [ 2 ]

22 голосов
/ 04 февраля 2011

Вам нужно self:

self.__private()

К классам в Python нужно привыкнуть, если вы переходите с C # / C ++ / Java, как это выглядит на самом деле.Это, вероятно, подрывает «питонический» способ формулировки вещей, но вы можете думать об этом так (это помогло мне):

Каждый класс определяет пространство имен, определенное изнутри себя как self и извнепо имени экземпляра этого класса.«Частные» вещи с двумя подчеркиваниями искажаются, так что извне вы должны вызывать их по специальному имени, но изнутри вы можете просто использовать self.__private().

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

Как упоминал Томас, self также является соглашением.Для любого метода (функции, объявленной как часть класса) экземпляр, к которому вызывается метод, является первым передаваемым параметром. Вы также можете легко сделать это:

def __private(randomText):
    print "Hey man! This is private!"

def public(otherRandomText):
    otherRandomText.__private()
    print "I don't care if you see this!"

Однако, если выСделайте так, чтобы дух логики и хороший стиль программирования преследовали вас и ваших потомков всю вечность.(self гораздо предпочтительнее).

Любые питонисты хотят исправить / объяснить дальше?

3 голосов
/ 04 февраля 2011

Ваш код пытается вызвать статическую функцию MyCalls .__ private, вы хотите сделать это:

class MyClass:
    def __private(self):
        print "Hey man! This is private!"

    def public(self):
        self.__private()
        print "I don't care if you see this!"

if __name__ == '__main__':
    x = MyClass()
    x.public()
...