Здравствуйте, гость ( Вход | Регистрация )
Novak | Дата 12.11.2010, 23:26 |
Не обязательно с таким именем, но если ты попытаешься объявить вообще без параметров - вылетит исключение. Питон хочешь или не хочешь, объект передаёт, а там уже ты разбирайся А исключение, что характерно, появится только при попытке использовать эту функцию
Результат: 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) |
|
Litkevich Yuriy | Дата 12.11.2010, 23:19 |
Если это просто функция класса, то без "селфа" никак. значит ли это, что в каждой функции класса обязан быть хотя бы один аргумент - self? |
|
Novak | Дата 12.11.2010, 23:15 |
Если это просто функция класса, то без "селфа" никак. У тебя в любом случае первым параметром передаётся текущий объект. иначе просто неоткуда такой переменной, как self взяться. Т.е. тебе нужно добавить его в объявление
|
|
Litkevich Yuriy | Дата 12.11.2010, 23:04 |
так-так, тогда получается, что я не правильно портирую: здесь я в функции писал только один входной аргумент (как и было в Си++), тогда получается self-а нет?оригинальный код: здесь переменные m_* - члены класса |
|
Novak | Дата 12.11.2010, 22:58 |
self - это просто переменная. в функциях класса она ссылается на объект, т.е. это не какое-то ключевое слово. Другими словами, в функцию класса передаётся объект параметром, явно. Через эту переменную можно получить доступ к полям объекта. Область видимости этой переменной такая же, как и у всех, объявленных внутри текущей фукнции - это сама функция. В рамках класса можно сделать вот так:
Результаты: 3 Потому рекомендуется все используемые поля без крайней необходимости объявлять сразу явно, или в теле класса, или в конструкторе-функции __init__ Да, не забывай, что в питоне все переменные - ссылки на объекты. Потому и можно ими так легко играться. |
|
Litkevich Yuriy | Дата 12.11.2010, 22:41 |
я смотрел описание класса, там в одной функции использовались переменные и так и так. но, те которые были без self, они как локальные в Си++ (например, создание компоновщиков, которые в других местах не нужны). А те, что с self использовались и в других функциях класса. Ещё вызывает запарку сама динамическая типизация. Если мне нужна переменная-член класса, то нужно просто написать
и всё? Т.е. self сделает своё дело, да? |
|
Novak | Дата 12.11.2010, 22:30 |
Первое - это переменная, вторая - по сути поле, тоже переменная, у другого объекта. На самом деле происходит поиск атрибута "myvar" у объекта "self" В питоне в фукнции у класса первым параметром передаётся переменная-объект, аналог this в плюсах Принято, что первый параметр у такой функции называется self Потому вторую запись чаще всего можно встретить в определении класса:
|
|
Litkevich Yuriy | Дата 12.11.2010, 15:21 |
чем отличаются две переменные, к которым присваивание осуществляется так: myvar = ... self.myvar = ... может быть первая локальная, а вторая член класса? |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 23.4.2024, 9:48 |