Вызов globals()
возвращает глобальные переменные модуля, в котором находится лексически вызов; в Python нет встроенной «динамической области видимости» - она имеет лексическую область, как и почти все современные языки.
Надежный, правильный способ получить желаемый эффект - это явно передать инициализатору AnimalSound
вызываемый объект, который он должен использовать для «создания шума»: то есть класс должен быть
class AnimalSound(object):
def __init__(self, makenoise=lambda: 'meow'):
self.makenoise = makenoise
def __str__(self):
return self.makenoise()
и вызов должен быть
sound = AnimalSound(makenoise)
Существуют практичные, но менее надежные решения, например, вызывающий абонент передает свой собственный globals()
(но это излишне ограничивает имя вызываемого пользователя!) Или даже (дрожь) общение по скрытым каналам, как другие сторонники ответа это было бы потенциальной катастрофой, если бы у вас было два экземпляра AnimalSound
, построенных по одному и тому же принципу в двух отдельных модулях и т. д., и т. д.). Но «явный лучше, чем неявный», а чистая, безопасная, открытая связь приводит к чистым, безопасным и надежным системным архитектурам: я настоятельно рекомендую вам выбрать этот маршрут.