Комментарии 23
Спасибо за статью, не знал про оператор @.
И вместо «расхрабриться» прочитал «расхабриться», что в этом случае даже уместней :)
И вместо «расхрабриться» прочитал «расхабриться», что в этом случае даже уместней :)
+2
Да, спасибо, сколько пишу на python, а все время узнаю что-то новое. Даже не догадывался об операторе @.
0
>>> карма_писателя = 10
>>> # Карма писателя после этой статьи:
... карма_писателя += 10
>>> карма_писателя
20
Хотел еще после первой статьи ссылку кинуть, но не смог зайти. Вот еще немного интересненького про python
0
НЛО прилетело и опубликовало эту надпись здесь
В предыдущей статье приводились подобные примеры, пожалуй, не соглашусь, типизация строгая, просто тяжёлое наследство в виде отсутствия выделенного булевого типа при создании языка и решение создать его как класс, наследуемый от целых чисел привёл к таким последствиям.
+1
В Python сильная типизация. '10' + 20
сделать не выйдет.
+1
Маленькое дополнение/пояснение по поводу атрибутов класса.
В питон следует различать класс как таковой и его экземпляры. Если в объявлении класса вы укажите не только методы, но и атрибуты, то эти атрибуты разделят между собой все экземпляры класса. Поведение таких атрибутов аналогично static значениям во многих других языках. Для доступа к таким значениям не обязательно создавать инстанс класса, можно через точку, как к атрибуту типа.
Атрибуты класса можно создавать и инициализировать в реализации метода __init__, который играет роль конструктора экземпляра, или динамически. В случае, когда динамическое создание атрибутов нежелательно, можно в декларации класса объявить массив __slots__, с перечислением имен всех доступных атрибутов, и питон не позволит создавать ни какие другие атрибуты, кроме этих.
В питон следует различать класс как таковой и его экземпляры. Если в объявлении класса вы укажите не только методы, но и атрибуты, то эти атрибуты разделят между собой все экземпляры класса. Поведение таких атрибутов аналогично static значениям во многих других языках. Для доступа к таким значениям не обязательно создавать инстанс класса, можно через точку, как к атрибуту типа.
Атрибуты класса можно создавать и инициализировать в реализации метода __init__, который играет роль конструктора экземпляра, или динамически. В случае, когда динамическое создание атрибутов нежелательно, можно в декларации класса объявить массив __slots__, с перечислением имен всех доступных атрибутов, и питон не позволит создавать ни какие другие атрибуты, кроме этих.
0
Спасибо, я именно это и хотел сказать, но у вас получилось понятнее.
Про __slots__ думал в следующих статьях написать, но пока не придумал, как это получше сделать, наверно, стоило прямо здесь и сказать сразу после примера с добавлением полей, но по хорошему, надо ещё и механизм, как это обеспечивается описать, а я пока не разбирался.
Про __slots__ думал в следующих статьях написать, но пока не придумал, как это получше сделать, наверно, стоило прямо здесь и сказать сразу после примера с добавлением полей, но по хорошему, надо ещё и механизм, как это обеспечивается описать, а я пока не разбирался.
0
Мне кажется об этом правильнее рассказывать по-другому.
1. У объекта могут быть атрибуты.
2. Класс — это тоже объект.
3. При обращении к атрибуту объекта (через точку или getattr) поиск происходит сначала в контексте самого объекта, потом в контексте его классов.
4. Запись атрибута происходит в контекст самого объекта.
1. У объекта могут быть атрибуты.
2. Класс — это тоже объект.
3. При обращении к атрибуту объекта (через точку или getattr) поиск происходит сначала в контексте самого объекта, потом в контексте его классов.
4. Запись атрибута происходит в контекст самого объекта.
0
3. При обращении к атрибуту объекта (через точку или getattr) поиск происходит сначала в контексте самого объекта, потом в контексте его классов.Главное не переборщить, чтобы не получилось каши. Обычно, имена хранятся в массиве __dir__, но есть еще слоты, а еще __getattr__ и __getattribute__, которые могут быть перекрыты, и реализовывать вычислимые атрибуты, и не только их. И это только про текущий контекст. А еще, если я не ошибаюсь, то логика поиска имен в родительских классах для второй и третей ветки различается. И чтобы было совсем весело, можно расказать о загрузке пакетов и классов, здесь тоже, если я не путаю, есть различия, потому что третий питон старается бороться с циклическим импортом.
+1
Спасибо, интересно.
Что-то разочаровало меня то, как устроены булевы типы, а именно наследование от целочисленного типа. В прошлой статье пример со словарём мягко говоря вообще не обрадовал.
Что-то разочаровало меня то, как устроены булевы типы, а именно наследование от целочисленного типа. В прошлой статье пример со словарём мягко говоря вообще не обрадовал.
0
Ярче всего идею, что python это не java иллюстрирует то, что добавление полей в объектах и классах осуществляется через обычное присваивание
Спасибо за наводку. Я даже предположить не мог что такое возможно. Это же прямое нарушение принципов ООП? или Питон не является объектно ориентированным?
0
Если это про нарушение инкапсуляции, то сеттеры её тоже нарушают (та же идея тут).
0
Какого принципа? Инкапсуляции? Как уже было сказано, этот принцип нарушается и в хвост, и в гриву.
И как можно быть не объектно-ориентируемым, но поддерживать создание классов и объектов?)
Вообще существует множество видений ООП, и видение Java, насколько я могу судить, ни чуть не ближе к Smalltalk, чем python и Java между собой.
И как можно быть не объектно-ориентируемым, но поддерживать создание классов и объектов?)
Вообще существует множество видений ООП, и видение Java, насколько я могу судить, ни чуть не ближе к Smalltalk, чем python и Java между собой.
0
Принципа абстракции.
Если определять язык программирования объектно ориентированным только по наличию конструкций для создания классов, объектов — то да. Только вот чем класс в Питоне отличается от просто контейнера, в который можно напихать что угодно?
Если определять язык программирования объектно ориентированным только по наличию конструкций для создания классов, объектов — то да. Только вот чем класс в Питоне отличается от просто контейнера, в который можно напихать что угодно?
0
Является. Если кто-то и нарушит эти принципы, то это будет программист. Он это сделает либо нарочно, а значит это его дело, либо нечаянно — такие ошибки надо искать линтерами. Просто питон не налагает лишних ограничений и не разводит бюрократию. Это позволяет ему быть лаконичным и простым.
+1
Нарушение каких принципов? Если вы имеете в виду инкапсуляцию, то не надо путать это понятие с сокрытием данных. Инкапсуляция — это по сути размещение в одном объекте данных и функций, которые используют и/или изменяют эти данные. В Python нет сокрытия данных и это не нарушает никакие принципы ООП.
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Интересности и полезности python. Часть 2