Как вызвать глобальную функцию из метода класса - PullRequest
0 голосов
/ 17 октября 2018

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

def __static_func(name):
    print 'Name = ' + name

class A:
    def __init__(self, name):
        self.name = name
    def fun(self):
        __static_func(self.name)

a = A('foo')
a.fun()

При запуске на Python 2.7 он выдает

NameError: global name '_A__static_func' is not defined

Итак, вопрос в том, как вызвать глобальную функцию из метода класса?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Я недавно читал книгу " Изучение Python от О'Рейли " (Страница 944, Глава 31), и было упомянуто, что при использовании двойных подчеркиваний __ в качестве начальных символов методаили переменная в Class, она автоматически добавляет _classname к этой функции, где classname - имя класса.Это делается для локализации имени в классе, к которому оно принадлежит.Это называется Имя искажения в контексте Атрибуты псевдоприватного класса .

Таким образом, вы можете использовать одно и то же имя __variable в двух разных классах A и B, поскольку переменные / методы станут приватными _A__variable и _B__variable соответственно.Поэтому просто назовите вашу глобальную функцию как-нибудь еще с одним подчеркиванием, например, чтобы избежать этого конфликта.

0 голосов
/ 17 октября 2018

Не используйте двойные подчеркивания.

def _static_func(name):
    print 'Name = ' + name

class A:
    def __init__(self, name):
        self.name = name
    def fun(self):
        _static_func(self.name)

a = A('foo')
a.fun()

Должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...