Форум сайта python.su
0
Случайно наткнулся.
class test: a = [] def __init__(self, x) self.a.append(x) foo = test(1) bar = test(5)
Офлайн
857
W.ThesisПотому что это переменная класса, а не переменная экземпляра.
Какого … ? Почему .a оказался разделяемым, общим?
>>> class A: ... def __init__(self, x): ... self.a = [] ... self.a.append(x) ... >>> a1 = A(1) >>> a2 = A(2) >>> >>> a1.a [1] >>> a2.a [2] >>>
Отредактировано py.user.next (Авг. 11, 2019 04:38:56)
Офлайн
0
py.user.next
Потому что это переменная класса, а не переменная экземпляра.
py.user.next
В классе ты определяешь переменные, которые должны быть во всех экземплярах одинаковыми. А вот в экземплярах ты определяешь переменные, которые должны быть уникальными в пределах экземпляра.
Офлайн
221
W.ThesisПространство имен в Python
Подскажите pls что конкретно по этому поводу можно почитать
W.ThesisКонцепция изменяемых и не изменяемых данных в Python.
Осталось выяснить почему одинаковыми оказываются члены типа “список”.
W.ThesisПотому что все онлайн курс предоставляют в той или иной степени поверхностный набор знаний о зяыке программирования.
ни в одном онлайн-руководстве по языку я этого нюанса не видел.
W.ThesisА чему вы так удивляетесь? Это же другой язык программирования. Или вы рассчитывали что все яп одинаковые? Посмотрите на С - там классов вообще нет, как и в Go например, как и в Rust. А если вы посмотрите на Haskell, то это настолько другой мир что вообще выворот мозгов.
Что, авторы питона изобрели свой собственный велосипед с петанкомм и хористками?
Офлайн
0
W.Thesisто есть для словаря
Сейчас проверю еще для “списка”.

Офлайн
0
JOHN_16
А чему вы так удивляетесь? Это же другой язык программирования. Или вы рассчитывали что все яп одинаковые? Посмотрите на С - там классов вообще нет, как и в Go например, как и в Rust. А если вы посмотрите на Haskell, то это настолько другой мир что вообще выворот мозгов.
P.S. и не надо так пассивно-агрессивно относится к чему то новому. Хотя почему то именно в стане PHP'шников такое не редко наблюдается
Офлайн
0
Так. Я выяснил. ИЧСХ - выяснил у блондинки, которая питона-то и не знает толком, но мозгой шевелить умеет.
Пишу сюда, может кому пригодится. Стыдно, я мог бы и сам догадаться.
Namespace тут роли не играет.
У классов Питона вообще отсуствует специальная секция декларации членов класса!
Это всего лишь часть кода, который будет исполнен один раз в момент объявления класса.
В том случае, если выполняется присвоение вроде prop = 1,2,3 неявным образом создается экземпляр класса “список” со значением 1,2,3 и ссылка на него присваивается члену prop.
Поэтому все объекты этого класса имеют prop указывающий на один и тот же объект-список.
Вот это и причина проблемы.
С целыми числами (и строками) этого не происходит, как я понял, потому, что согласно п 9.1. это “неизменяемый” объект и работа с ними подчинена другим правилам.
Офлайн
253
W.ThesisКак ваши неправильные домыслы так и домыслы вашей блондинки тут никому не нужны. Информацию надо черпать из документации.
Пишу сюда, может кому пригодится.
W.ThesisПравила обращения с изменяемыми и неизменяемыми объектами тут абсолютно одинаковы.
С целыми числами (и строками) этого не происходит
self.a.append(1)
self.a=self.a+[1]
a=[]
Отредактировано doza_and (Авг. 11, 2019 15:33:51)
Офлайн
857
W.ThesisВ питоне класс - такой же объект, как и всё остальное. Поэтому можно делать и метаклассы - это классы, экземпляры которых являются классами. Так что это вполне нормальное явление, когда обект-класс имеет атрибуты, к которым можно получать доступ напрямую, без создания экземпляра.
Класс - чертёж
W.ThesisЭто если ООП-пардигму не знаешь и думаешь, что ООП-языки - это и есть ООП. Класс - это множество объектов, сгруппированных по определённому набору признаков. Вот ребятки, которые знают синтаксис записи класса на каком-либо языке (да хоть на всех языках), совершенно не знают, как эти классы придумать сначала и какие из них нужны, а какие - нет. Можно ещё пытаться применять шаблоны ООП, только так всё равно ничего не получается, так как ООП шаблоны никаких классов не создают и при их применении всё уже должно быть придумано.
Класс - чертёж, объект - изделие.
W.ThesisНет, член класса - это просто какой-то атрибут, тогда как свойство обязательно должно быть доступно снаружи и является частью интерфейса класса наряду с его методами. Свойство - это как метод, только который не надо вызывать.
Понятия “член класса” и “свойство объекта” в прочих ООП-языках почти эквивалентны
W.ThesisПитон погибче таких языков как PHP, Java и уж тем более C++. Поэтому в нём можно делать многие вещи. В C++ попробуй класс куда-нибудь передай в качестве аргумента. В питоне же запросто это делается.
Что, авторы питона изобрели свой собственный велосипед с петанкомм и хористками?
W.ThesisС числом происходит всё то же самое. Просто когда ты его присваиваешь потом в экземпляре, имя отвязывается от старого объекта и привязывается к новому. В списках же имя остаётся привязанным к одному списку и тот просто пополняется в раззные моменты времени.
Если этот самый “член класса” сделать целым числом, то вышеописанной ерунды не происходит и у каждого экземпляра наличествует своё собственное значение члена “.a”
W.ThesisПри этом на нём можно реализовывать ООП-архитектуры. Не так это удобно, как в языках, в которых для парадигмы ООП есть синтаксический сахар.
С - вообще не ООП язык
W.ThesisСтранно, что она не описана, но здесь про эту особенность знают все.
что эта критически выжная “мина” не прописана большими красными буквами в каждом первом руководстве

W.ThesisНет никакого члена prop, есть только имя в пространстве имён, которое в любой момент можно отвязать от одного объекта и привязать к другому, и повторять это можно несколько раз.
В том случае, если выполняется присвоение вроде prop = 1,2,3 неявным образом создается экземпляр класса “список” со значением 1,2,3 и ссылка на него присваивается члену prop.
W.ThesisНет, происходит всё то же самое, просто при замене старый объект выбрасывается, а имя просто привязывается к новому объекту.
С целыми числами (и строками) этого не происходит, как я понял, потому, что согласно п 9.1. это “неизменяемый” объект и работа с ними подчинена другим правилам.
Отредактировано py.user.next (Авг. 11, 2019 16:44:50)
Офлайн