LINUX.ORG.RU
ФорумTalks

Еще чуть-чуть и я разочаруюсь в ООП...


0

0

Не знаю, насколько это для Development, пожалуюсь тут.

Итак, Python 2.4.3, Gentoo

Берем код. Простейший класс с одним свойством (типа список).

=======================================================
class buf:
    array = []
    
    def __init__(self):
        pass
    

#порождаем два экземпляра класса        
a1 = buf()
a2 = buf()

#выводим их, что б убедится, что указывают они в разные места
print a1
print a2

#модифицируем в первом объекте свойство
a1.array.append('test')
#опа, а во втором объекте свойство тоже модифицировалось. Шо за нах?
print a2.array

=======================================================

У меня сие выводит примерно так:
<__main__.buf instance at 0xb7c1214c>
<__main__.buf instance at 0xb7c121ac>
['test']

Хотя, по идее, должно в последней строке выдавать пустое множество []


Где я облажался?
★★★★★

Re: Еще чуть-чуть и я разочаруюсь в ООП...

У тебя array -- это классовая переменная, то есть она общая для всех экземплеров класса. Тебе надо сделать так:

In [1]: class buf:
   ...:     def __init__(self):
   ...:         self.array=[]
   ...:
   ...:

In [2]: a=buf()

In [3]: b=buf()

In [4]: a.array.append("hello")

In [5]: print a.array
['hello']

In [7]: print b.array
[]
              

rab_boziy ()
Ответ на: Re: Еще чуть-чуть и я разочаруюсь в ООП... от AngryElf

Re: Еще чуть-чуть и я разочаруюсь в ООП...

> Офигеть. А нафига это может понадобится?

Когда нужно, чтоб у объектов (сиречь, экземпляров класса) было общее состояние, которое можно быстро поменять. Пример посмотри в книжке Programming Ruby.

http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html

rab_boziy ()

Re: Еще чуть-чуть и я разочаруюсь в ООП...

Что-то мне подсказывает, что разочаровываться надо в себе - про модификацию разделяемых (shared) структур слышал?

Begemoth ★★★★★ ()
Ответ на: Re: Еще чуть-чуть и я разочаруюсь в ООП... от rab_boziy

Re: Еще чуть-чуть и я разочаруюсь в ООП...

Нифига это не классовая переменная. Смотри:

max@triton:~/ > python                                                                                                                                       
Python 2.4.4c0 (#2, Jul 30 2006, 16:45:39) 
[GCC 4.1.2 20060729 (prerelease) (Debian 4.1.1-10)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class buf:
...     array = []
...     def __init__(self):
...             pass
... 
>>> a = buf()
>>> b = buf()
>>> a.array = [1];
>>> a
<__main__.buf instance at 0x3007cee0>
>>> b
<__main__.buf instance at 0x3007cf08>
>>> a.array
[1]
>>> b.array
[]
>>> 

Begemoth ★★★★★ ()
Ответ на: Re: Еще чуть-чуть и я разочаруюсь в ООП... от Begemoth

Re: Еще чуть-чуть и я разочаруюсь в ООП...

вот буквоед :-\ ЛЮБОЙ питоновец знает, о чем ты говоришь, а "классовая переменная" -- всего лишь удобный ярлык. Так чего, спрашивается, выделываться и пытаться показать свою крутизну и знания?

uj2 ★★★ ()

Re: Еще чуть-чуть и я разочаруюсь в ООП...

А ООП тут причем?

devinull ★★ ()

Re: Еще чуть-чуть и я разочаруюсь в ООП...

Не надо разочаровываться в ООП, разочаруйся в питоне

>Где я облажался?

Когда выбрал питон вместо жабки. В жабке для членов класса есть спецслово static

anonymous ()
Ответ на: Re: Еще чуть-чуть и я разочаруюсь в ООП... от Begemoth

Re: Еще чуть-чуть и я разочаруюсь в ООП...

> Что-то мне подсказывает, что разочаровываться надо в себе

Дык необразованные мы. Два класса церковно-приходской.

> про модификацию разделяемых (shared) структур слышал?

Не-а. Дай линк, плз.

AngryElf ★★★★★ ()
Ответ на: Re: Еще чуть-чуть и я разочаруюсь в ООП... от AngryElf

Re: Еще чуть-чуть и я разочаруюсь в ООП...

Дэк эта...

Ноль - родился.

Раз - ты не прочитал спеки на используемые функции.

Два - запостил суда.

Три - начал писать "а нафига" и прочую глупость, вместо того чтобы подумать.

Сестра! Следующий!

anonymousI ()

Re: Еще чуть-чуть и я разочаруюсь в ООП...

Вот именно поэтому скриптовые питоны/руби/etc.. никогда не станут мэйнстримовыми языками, в отличии от Java/C#

Nagwal ★★★★ ()
Ответ на: Re: Еще чуть-чуть и я разочаруюсь в ООП... от uj2

Re: Еще чуть-чуть и я разочаруюсь в ООП...

Ага, а цикл - это удобный ярлык для рекурсии. То, что таким образом можно ИМИТИРОВАТЬ классовые переменные для типов, допускающих изменение значения (такие как списки и классы), еще не значит, что можно так навешивать ярлыки. Изобрази ка переменную класса таким вот образом для целых чисел (без привлечения дополнительных контейнеров!).

Begemoth ★★★★★ ()
Ответ на: Re: Еще чуть-чуть и я разочаруюсь в ООП... от AngryElf

Re: Еще чуть-чуть и я разочаруюсь в ООП...

Линк, особенно в контексте птиона, не дам, но проблема изменения разделяемых структур рассматривается в "Developing Applications with Objective Caml" (при сравнении функционального и императивного стиля).

Begemoth ★★★★★ ()
Ответ на: Re: Еще чуть-чуть и я разочаруюсь в ООП... от anonymousI

Re: Еще чуть-чуть и я разочаруюсь в ООП...

> Дэк эта...

> Ноль - родился.

Ну виноват, да :)

> Раз - ты не прочитал спеки на используемые функции.

/me наивно полагал, что ООП - и в африке ООП. И экземпляры класса ничего общего между собой не имеют. Предыдущий мой ООП был на паскале (куда вы убегаете??)

> Три - начал писать "а нафига" и прочую глупость, вместо того чтобы подумать.

Я попросил ткнуть носом - где я не прав. А ты меня тыкаешь чисто из принципа - "не прав, сцуко, не прав". man что, в обшем?

Я сразу знал, что зря пощу в толксы... Ничо, зато весело :)

AngryElf ★★★★★ ()
Ответ на: Re: Еще чуть-чуть и я разочаруюсь в ООП... от Begemoth

Re: Еще чуть-чуть и я разочаруюсь в ООП...

> Линк, особенно в контексте птиона, не дам, но проблема изменения разделяемых структур рассматривается в "Developing Applications with Objective Caml" (при сравнении функционального и императивного стиля).

Спасибо и на этом. Хоть и противится душа всяким камлям и лиспам, но придется, видимо, уже в ближайшее время их изучать... :)

AngryElf ★★★★★ ()
Ответ на: Re: Еще чуть-чуть и я разочаруюсь в ООП... от AngryElf

Re: Еще чуть-чуть и я разочаруюсь в ООП...

>/me наивно полагал, что ООП - и в африке ООП. И экземпляры класса ничего общего между собой не имеют. Предыдущий мой ООП был на паскале (куда вы убегаете??)

Так и есть, ООП он и в Африке ООП. И статические члены класса есть и в C++, и в Жабе, и подозреваю что во всех остальных ООП-языках тоже =)

MYMUR ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.