Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 12, 2008 09:12:05

nesusvet
От:
Зарегистрирован: 2008-01-12
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

self не понимаю

Не понимаю до конца, если я обозначаю self в классе, то допустим переменная которую я обозначил как self.i будет действовать только на экземпляр класса, но ни как не на другие экземпляры этого же класса? если я не обозначу как self то эта переменная будет действовать на все экземпляры?

И еще не понимаю почему происходит вот так, в этом примере:

class A:
def __init__(self, i = 1):
self.i = i

a = A(5)
b = A(2)

print a.i
print b.i

Вывод - то, что я ожидал
5
2

другой пример:

class A:
def __init__(self, i = 1):
self.i = i

a = A
b = A

a.i = 5
b.i = 2

print a.i
print b.i

вывод: то, что я не ожидал, думал будет 5 и 2 - почему переменная подействовала на все экземпляры?
2
2

python 2.5



Офлайн

#2 Янв. 12, 2008 09:42:58

tabajara
От:
Зарегистрирован: 2007-01-02
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

self не понимаю

>>> class A:
...     def __init__(self, i=1):
...         self.i = i
...
>>> a = A
>>> b = A
>>> print a.i
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class A has no attribute 'i'
>>> dir(a)
['__doc__', '__init__', '__module__']
>>> a.i = 5
>>> dir(a)
['__doc__', '__init__', '__module__', 'i']
>>> print a.i
5
>>>
>>> a.qaz = 7
>>> print a.qaz
7
>>> print b.qaz
7

a.i != self.i, то інше і )



Отредактировано (Янв. 12, 2008 09:49:00)

Офлайн

#3 Янв. 12, 2008 11:04:16

nesusvet
От:
Зарегистрирован: 2008-01-12
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

self не понимаю

Простите, можно по-русский, я просто из России



Отредактировано (Янв. 12, 2008 11:04:28)

Офлайн

#4 Янв. 12, 2008 12:47:26

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

self не понимаю

nesusvet
вывод: то, что я не ожидал, думал будет 5 и 2 - почему переменная подействовала на все экземпляры?
nesusvet
a = A
b = A
Это не инстанцировние класса(нет скобок). a, b - не экземпляры класса, а сам класс.



Офлайн

#5 Янв. 12, 2008 13:22:37

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

self не понимаю

nesusvet
Простите, можно по-русский, я просто из России
a.i != self.i, поскольку разные объекты, поэтому разное i



Офлайн

#6 Янв. 12, 2008 15:14:30

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

self не понимаю

На случай, если что-то еще не понятно, поясню - в первом случае a и b - экземпляры класса A, а во втором случае - сам класс A (как указал уже Daevaorn), это означает, что во втором случае a и b ссылаются на один и тот же объект (ибо класс также является объектом :-). Собственно после процедуры присваивания a = A и b = B ни а, ни b не имеют аттрибута i. Но затем ты его определяешь на уровне класса операцией a.i = 5, а затем меняшь на двойку (b.i = 2). Следовательно результат вывода на экран - две двойки.



Офлайн

#7 Янв. 12, 2008 19:01:11

nesusvet
От:
Зарегистрирован: 2008-01-12
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

self не понимаю

Спасибо!!! вроде все понял….



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version