Python, вопрос о переменных |
Здравствуйте, гость ( Вход | Регистрация )
Python, вопрос о переменных |
Litkevich Yuriy |
12.11.2010, 15:21
Сообщение
#1
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
чем отличаются две переменные, к которым присваивание осуществляется так:
myvar = ... self.myvar = ... может быть первая локальная, а вторая член класса? |
|
|
Novak |
12.11.2010, 22:30
Сообщение
#2
|
Активный участник Группа: Участник Сообщений: 319 Регистрация: 15.3.2008 Из: Замкадыш Пользователь №: 121 Спасибо сказали: 28 раз(а) Репутация: 6 |
Первое - это переменная, вторая - по сути поле, тоже переменная, у другого объекта. На самом деле происходит поиск атрибута "myvar" у объекта "self"
В питоне в фукнции у класса первым параметром передаётся переменная-объект, аналог this в плюсах Принято, что первый параметр у такой функции называется self Потому вторую запись чаще всего можно встретить в определении класса:
Сообщение отредактировал Novak - 12.11.2010, 22:43 |
|
|
Litkevich Yuriy |
12.11.2010, 22:41
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
я смотрел описание класса, там в одной функции использовались переменные и так и так.
но, те которые были без self, они как локальные в Си++ (например, создание компоновщиков, которые в других местах не нужны). А те, что с self использовались и в других функциях класса. Ещё вызывает запарку сама динамическая типизация. Если мне нужна переменная-член класса, то нужно просто написать
и всё? Т.е. self сделает своё дело, да? |
|
|
Novak |
12.11.2010, 22:58
Сообщение
#4
|
Активный участник Группа: Участник Сообщений: 319 Регистрация: 15.3.2008 Из: Замкадыш Пользователь №: 121 Спасибо сказали: 28 раз(а) Репутация: 6 |
self - это просто переменная. в функциях класса она ссылается на объект, т.е. это не какое-то ключевое слово.
Другими словами, в функцию класса передаётся объект параметром, явно. Через эту переменную можно получить доступ к полям объекта. Область видимости этой переменной такая же, как и у всех, объявленных внутри текущей фукнции - это сама функция. В рамках класса можно сделать вот так:
Результаты: 3 Потому рекомендуется все используемые поля без крайней необходимости объявлять сразу явно, или в теле класса, или в конструкторе-функции __init__ Да, не забывай, что в питоне все переменные - ссылки на объекты. Потому и можно ими так легко играться. Сообщение отредактировал Novak - 12.11.2010, 23:02 |
|
|
Litkevich Yuriy |
12.11.2010, 23:04
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
так-так, тогда получается, что я не правильно портирую:
здесь я в функции писал только один входной аргумент (как и было в Си++), тогда получается self-а нет?оригинальный код: здесь переменные m_* - члены класса
|
|
|
Novak |
12.11.2010, 23:15
Сообщение
#6
|
Активный участник Группа: Участник Сообщений: 319 Регистрация: 15.3.2008 Из: Замкадыш Пользователь №: 121 Спасибо сказали: 28 раз(а) Репутация: 6 |
Если это просто функция класса, то без "селфа" никак. У тебя в любом случае первым параметром передаётся текущий объект.
иначе просто неоткуда такой переменной, как self взяться. Т.е. тебе нужно добавить его в объявление
|
|
|
Litkevich Yuriy |
12.11.2010, 23:19
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Novak |
12.11.2010, 23:26
Сообщение
#8
|
Активный участник Группа: Участник Сообщений: 319 Регистрация: 15.3.2008 Из: Замкадыш Пользователь №: 121 Спасибо сказали: 28 раз(а) Репутация: 6 |
Не обязательно с таким именем, но если ты попытаешься объявить вообще без параметров - вылетит исключение. Питон хочешь или не хочешь, объект передаёт, а там уже ты разбирайся
А исключение, что характерно, появится только при попытке использовать эту функцию
Результат: I am alive Traceback (most recent call last): File "/Users/novak/git/py_koans/py_koans/python 2/koans/test.py", line 10, in <module> object.func() TypeError: func() takes no arguments (1 given) При передаче лишнего параметра также вылезет исключение:
Результат: I am alive Oh, no Traceback (most recent call last): File "/Users/novak/git/py_koans/py_koans/python 2/koans/test.py", line 11, in <module> object.func(1) TypeError: func() takes exactly 1 argument (2 given) Сообщение отредактировал Novak - 12.11.2010, 23:24 |
|
|
Текстовая версия | Сейчас: 25.11.2024, 19:39 |