Форум сайта python.su
Не понимаю до конца, если я обозначаю 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
Офлайн
>>> 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
Отредактировано (Янв. 12, 2008 09:49:00)
Офлайн
Простите, можно по-русский, я просто из России
Отредактировано (Янв. 12, 2008 11:04:28)
Офлайн
nesusvet
вывод: то, что я не ожидал, думал будет 5 и 2 - почему переменная подействовала на все экземпляры?
nesusvetЭто не инстанцировние класса(нет скобок). a, b - не экземпляры класса, а сам класс.
a = A
b = A
Офлайн
nesusveta.i != self.i, поскольку разные объекты, поэтому разное i
Простите, можно по-русский, я просто из России
Офлайн
На случай, если что-то еще не понятно, поясню - в первом случае a и b - экземпляры класса A, а во втором случае - сам класс A (как указал уже Daevaorn), это означает, что во втором случае a и b ссылаются на один и тот же объект (ибо класс также является объектом :-). Собственно после процедуры присваивания a = A и b = B ни а, ни b не имеют аттрибута i. Но затем ты его определяешь на уровне класса операцией a.i = 5, а затем меняшь на двойку (b.i = 2). Следовательно результат вывода на экран - две двойки.
Офлайн
Спасибо!!! вроде все понял….
Офлайн