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