nesusvet
Янв. 12, 2008 09:12:05
Не понимаю до конца, если я обозначаю 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
tabajara
Янв. 12, 2008 09:42:58
>>> 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, то інше і )
nesusvet
Янв. 12, 2008 11:04:16
Простите, можно по-русский, я просто из России
Александр Кошелев
Янв. 12, 2008 12:47:26
nesusvet
вывод: то, что я не ожидал, думал будет 5 и 2 - почему переменная подействовала на все экземпляры?
nesusvet
a = A
b = A
Это не инстанцировние класса(нет скобок). a, b - не экземпляры класса, а сам класс.
bialix
Янв. 12, 2008 13:22:37
nesusvet
Простите, можно по-русский, я просто из России
a.i != self.i, поскольку разные объекты, поэтому разное i
ZAN
Янв. 12, 2008 15:14:30
На случай, если что-то еще не понятно, поясню - в первом случае a и b - экземпляры класса A, а во втором случае - сам класс A (как указал уже Daevaorn), это означает, что во втором случае a и b ссылаются на один и тот же объект (ибо класс также является объектом :-). Собственно после процедуры присваивания a = A и b = B ни а, ни b не имеют аттрибута i. Но затем ты его определяешь на уровне класса операцией a.i = 5, а затем меняшь на двойку (b.i = 2). Следовательно результат вывода на экран - две двойки.
nesusvet
Янв. 12, 2008 19:01:11
Спасибо!!! вроде все понял….