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']

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


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

У тебя 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
()
Ответ на: комментарий от rab_boziy

> классовая переменная

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

И в туториале про это говорится как-то вскольз...

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от AngryElf

Пошел переносить все свойства в __init__... Вот ведь какая загогулина...

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от AngryElf

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

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

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

rab_boziy
()
Ответ на: комментарий от rab_boziy

Хых. Интересно. Впринципе, могу и я заюзать эту штуку. Треды пачками грохать :)

AngryElf ★★★★★
() автор топика

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

Begemoth ★★★★★
()
Ответ на: комментарий от rab_boziy

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

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 ★★★★★
()
Ответ на: комментарий от Begemoth

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

uj2 ★★★
()

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

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

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

anonymous
()
Ответ на: комментарий от Begemoth

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

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

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

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

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от AngryElf

Дэк эта...

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

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

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

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

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

anonymousI
()

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

Nagwal ★★★★
()
Ответ на: комментарий от uj2

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

Begemoth ★★★★★
()
Ответ на: комментарий от AngryElf

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

Begemoth ★★★★★
()
Ответ на: комментарий от anonymousI

> Дэк эта...

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

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

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

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

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

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

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

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от Begemoth

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

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

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от AngryElf

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

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

MYMUR ★★★★
()
Ответ на: комментарий от AngryElf

> Хоть и противится душа всяким камлям и лиспам

почему противицо? Просто интересно.

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