1 | ||||||||||||||||
NameError: global name 'self' is not defined14.01.2019, 16:00. Показов 3774. Ответов 9
Метки нет (Все метки)
На фоне параллельного изучения js я обнаружил, что довольно неглубоко знаю python. Например, о такой фиче, как использование функций в качестве объектов. Читал, что Гвидо вкладывал в функции понятия сабклассов - то есть объектов, которые имеют поведение как классов, но, видимо, с какими-то ограничениями
В частности для меня остается загадкой, почему код:
Но если попробовать инициализировать f как объект:
0
|
14.01.2019, 16:00 | |
Ответы с готовыми решениями:
9
Не работает код. Ошибка NameError: global name 'Pizza' is not defined. Что я не правильно делаю? NameError: name 'n' is not defined NameError: name 'a' is not defined NameError: name 'self' is not defined |
Просто Лис
|
|||||||||||
14.01.2019, 16:58 | 2 | ||||||||||
Сообщение было отмечено mik-a-el как решение
Решение
Логично, ведь переменной self не существует.
1
|
14.01.2019, 19:52 | 3 |
Вы это наверняка читали не у Гвидо. А фантазии толкователей не стоит принимать всерьез, если они не имеют общепризнанного авторитета, как например М.Лутц. Хотя и в изложении последнего встречаются ошибки, хотя и редко.
Итак, что такое функции. В питоне это объекты, как и многие другие объекты, числа, списки, словари и т.д. Классы кстати , это тоже объекты. Особенность классов, это генерировать экземпляры (объекты), которые все обладают определенным заранее заданным набором атрибутов, которые задаются внутри класса. Функции, определенные внутри класса, называют методами. И только они могут иметь (или не иметь) аргумент self. У Вас присутствует self, но не описан класс. Такой код бессмысленный, и нет возможности обсуждать его работу. Добавлено через 14 минут Рыжий Лис, все правильно Вам написал. От себя добавлю. В первом примере объекту-функции f присваивается атрибут и его значение. Ниже выводится значение этого атрибута. При этом вызов функции не осуществляется. Вызов функции осуществляется круглыми скобками, которые должны находится после имени функции. И так, в первом примере вызов функции не осуществляется, поэтому не проявляется ошибка внутри функции, а именно присутствие неопределенного имени self. Во втором же примере осуществляется вызов функции d = f(), поэтому работает ее содержимое, и выявляется ошибка внутри функции. Добавлено через 1 час 2 минуты Тут я не верно выразился, имя self можно использовать в любом месте, просто в питон принято это имя давать в качестве обобщенного объекта класса, как аргумент в методе __init__, инициализирующим атрибуты общие для всех экземпляров данного класса.
1
|
19.01.2019, 12:45 [ТС] | 4 | |||||||||||||||||||||||||||||||||||
Рыжий Лис,
def f(self): . Но тогда в нее надо передать экземпляр класса этой функции, т.е. self...:
К числам, спискам и прочим я не могу добавить атрибут во время выполнения, как в примере выше к добавил к функции. Например, если я напишу int.r=7 или list.r = 7 , то получу ошибку can't set attributes of built-in/extension type . Значит, они все-таки не совсем такие же?...Я решил заморочиться и после прочтения ваших ответов пошел в тему на хабре и пришел к выводу, что использовать функцию для генерации нового объекта невозможно, т.к. на это способны только объекты типа 'type', которыми и являются классы:
__metaclass__ = type ? Но решения этому я так и не нашел )Короче, поразмыслив мозгами, не придумал, ничего другого, как реализовать генератор объектов внутри функции через конструктор type:
Единственное, что мне пришло в голову - это использовать staticmethod:
Я всегда об этом в питоне забываю. Привык, что в шарпе все подобные ошибки выскакивают на этапе компиляции не завимисо от того. будет ли код выполнен
0
|
19.01.2019, 13:26 | 6 |
Я как то не задумывался, действительно все это объекты, но объекты разные и обладающие разными свойствами. Хотя все объекты принадлежат классу object, но видимо в методах класса object нет общего для всех экземпляров этого класса, то есть для всех объектов, метода присваивания экземпляру атрибута.
0
|
563 / 303 / 189
Регистрация: 20.05.2016
Сообщений: 592
|
|
19.01.2019, 16:25 | 8 |
Viktorrus, просто у каких-то объектов есть __dict__, у каких-то нет; у большинства стандартных его нет (у экземпляров самого object тоже, кстати, нету).
0
|
19.01.2019, 17:12 [ТС] | 9 | ||||||||||
Собственно, к этому я и пришел
:
new = lambda x: type(x, (), {}) Вместо:
0
|
Просто Лис
|
|||||||||||
19.01.2019, 17:35 | 10 | ||||||||||
А смысл всего этого?
Попробуйте декораторы:
0
|
19.01.2019, 17:35 | |
19.01.2019, 17:35 | |
Помогаю со студенческими работами здесь
10
NameError: name 'i' is not defined. Did you mean: 'id'? NameError: name 'Tk' is not defined NameError: name 'vk' is not defined NameError: name 'с' is not defined NameError: name 'name' is not defined NameError: name 'S' is not defined. Did you mean: 'Sa'? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |