crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Litkevich Yuriy
  опции профиля:
сообщение 12.11.2010, 15:21
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


чем отличаются две переменные, к которым присваивание осуществляется так:
myvar = ...
self.myvar = ...

может быть первая локальная, а вторая член класса?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Novak
  опции профиля:
сообщение 12.11.2010, 22:58
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 319
Регистрация: 15.3.2008
Из: Замкадыш
Пользователь №: 121

Спасибо сказали: 28 раз(а)




Репутация:   6  


self - это просто переменная. в функциях класса она ссылается на объект, т.е. это не какое-то ключевое слово.
Другими словами, в функцию класса передаётся объект параметром, явно.
Через эту переменную можно получить доступ к полям объекта.
Область видимости этой переменной такая же, как и у всех, объявленных внутри текущей фукнции - это сама функция.
В рамках класса можно сделать вот так:
class A(object):
    def func1(self):
        var1 = 3 # здесь var1 и self - по сути, одинковые переменные. var1 ссылается на объект типа Int, self - на объект типа A
        self.val = var1 # тут мы полю val объекта типа A присваиваем значение переменной va1
    def func2(notself):
        print notself.val # тут у нас просто переменная, можно сказать, локальная, которая ссылается на объет типа A 

object1 = A()
object1.func1() # вызываем сначала первую фукнцию, у объекта переменной object1 появляется поле val
object1.func2() # а тут выводится значение этого поля
# будем вызвать наоборот - получим ошибку, что у объекта нет атрибута val
object2 = A()
try:
    object2.func2() # у объекта пока нет поля val
except Exception as e:
    print e

Результаты:

3


Потому рекомендуется все используемые поля без крайней необходимости объявлять сразу явно, или в теле класса, или в конструкторе-функции __init__

Да, не забывай, что в питоне все переменные - ссылки на объекты. Потому и можно ими так легко играться.

Сообщение отредактировал Novak - 12.11.2010, 23:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 12.5.2025, 13:37