@rudepython

Страница 745 из 1719
Дмитрий
08.12.2017
07:24:46
Есть ли возможность как-то указать в базовом классе на метод так, чтобы наследники были обязаны реализовывать его даже если этот метод не будет вызываться?

Zart
08.12.2017
07:25:25
абстрактных классов в питоне нет

если сильно-сильно-сильно горит, можно сделать метаклассами, но смысл?

Cykooz
08.12.2017
07:27:30
А модуль abc со своим декоратором @abstractmethod разве не запрещает создавать экземпляры классов если в них не переопределены вот эти "абстрактные методы" ?

Google
Дмитрий
08.12.2017
07:28:20


Cykooz
08.12.2017
07:28:39
Ну там одного декоратора мало

Дмитрий
08.12.2017
07:28:51
ага, я уже понял

Cykooz
08.12.2017
07:29:00
Надо ещё унаследоваться от ABC, например

Zart
08.12.2017
07:29:03
зачем пасс, а не raise AbstractMethodError?

Дмитрий
08.12.2017
07:30:00
разобрался)

Cykooz
08.12.2017
07:30:16
За 13 лет с питоном, ни разу не юзал эти "абстрактые классы"

Zart
08.12.2017
07:30:24
если учил ооп по жабе или шарпу - лучше не лезть в питон с этой ерундой

Дмитрий
08.12.2017
07:30:30
зачем пасс, а не raise AbstractMethodError?
Так условие, что не вызываю этот метод

по плюсам

Cykooz
08.12.2017
07:30:39
И даже не видел за пределами стандартной либы, что бы их кто то юзал

Zart
08.12.2017
07:30:39
ичо...

во-первых если либа не только для тебя, кто-то другой вызовет рейз будет заодно и документацией

Google
Zart
08.12.2017
07:31:36
мне абц в питоне нифига не нравится...

Дмитрий
08.12.2017
07:31:48
ну он же не просто так сделан

Zart
08.12.2017
07:31:51
кому нужны интерфейсы - берет z.i

Вероника
08.12.2017
07:31:53
Как дела?

Дмитрий
08.12.2017
07:32:00
были какие-то потребности

для таких как я

:D

Zart
08.12.2017
07:32:16
ну он же не просто так сделан
его вводили для решения задач детекта протоколов

Дмитрий
08.12.2017
07:32:34
хм, не знал об этом

Zart
08.12.2017
07:33:37
ну вот к примеру если методу нужно выводить скажем чтото на печать но не обязательно на вывод, то можно к примеру передать аргумент def foo(fp=None): print >>>fp, ... # эпоха второго питона

для целей печати к примеру достаточно чтобы у fp был метод write

поэтому например вводились проверки типа if hasattr(fp, 'write') или же проверялось наследование if isinstance(fp, basestr) чтобы например если передана строка - то это имя файла, иначе файл-лайк объект

абц собсно формализовал практику проверки интерфейса через isinstance

Cykooz
08.12.2017
07:37:25
ну он же не просто так сделан
По моему его основная задача - описывать "протоколы". Абстрактные классы - побочный продукт

Zart
08.12.2017
07:39:28
в общем если сравнивать с плюсами, то в питоновом оопе 1) все методы виртуальны 2) нет деления по видимости private/protected/public 3) множественное наследование имеет супер() для решения алмазной зависимости 4) "конструктор" лишь один. роль перегрузки конструкторов могут играть классметоды

Katerina
08.12.2017
07:39:44
Питон ?

Zart
08.12.2017
07:40:14
что это за боты выше...

Саша
08.12.2017
07:40:26
что за алмазная зависимость?

Zart
08.12.2017
07:40:59
когда у тебя есть базовый класс А от него наследуются Б(А) и Ц(А) а потом есть класс Д(Ц, Б)

Вероника
08.12.2017
07:40:59
Всм боты?

Google
Zart
08.12.2017
07:41:56
в этой ситуации при вызовах метода и их родительских по цепочке возникают две проблемы 1) порядок вызовов 2) двойной вызов методов у А супер() решает эту проблему в питоне

Cykooz
08.12.2017
07:42:05
что за алмазная зависимость?
Это ещё называют - ромбовидная зависимость

Саша
08.12.2017
07:42:18
понял, спасибо

Zart
08.12.2017
07:42:46
A / \ B C \ / D потому и "алмазная"

Саша
08.12.2017
07:42:54
да понял я, понял

Zart
08.12.2017
07:43:53
во многих других ооп языках (жаба, шарп) этой проблемы нет так как нет множественного наследования

dmks
08.12.2017
07:44:04
если учил ооп по жабе или шарпу - лучше не лезть в питон с этой ерундой
Вообще боль, после плюсов пытался написать синглтон на питоне

И не понимал почему хрень всегда выходит

Zart
08.12.2017
07:44:29
самый простой синглтон в питоне - тупо модуль с глобалом

dmks
08.12.2017
07:44:35
Да :D

Zart
08.12.2017
07:44:48
есть тонны рецептов, но там зачастую вместо синглетона борг

и оверинжиринга 500%

dmks
08.12.2017
07:45:55
С наследованием и абц я тоже мучался, кстати

Потом в какой то момент понял что я хочу писать как на плюсах, но только на питоне, а это не работает

Zart
08.12.2017
07:46:47
в питоне множественное наследование обычно применяют для миксинов, а там алмазной проблемы тоже нет обычно

dmks
08.12.2017
07:47:21
И жить стало проще, жить стало веселей

Zart
08.12.2017
07:48:10
Всм боты?
по теме канала было бы что, а не просто что попало...

Jonh
08.12.2017
07:56:53
И даже не видел за пределами стандартной либы, что бы их кто то юзал
Я юзал, чтобы принудить пользователей библиотеки реализовывать заданный интерфейс.

insanemainfame
08.12.2017
08:05:16
мне абц в питоне нифига не нравится...
поддерживаю, проще raise NotImplemented сделать и метакласы конфликтуют

Roman
08.12.2017
08:07:09
Потом в какой то момент понял что я хочу писать как на плюсах, но только на питоне, а это не работает
наследование родительским классом (object) решает какую то проблему с навигацией по классам, но не помню точно какую

Google
Zart
08.12.2017
08:12:14
вут?

все классы наследуются от object, кроме старых классов второго питона

class Old: """Old-style class in Python 2.x, New-style In 3.x""" class New(object): """New-style class in Python 2.x, 3.x"""

Alexey
08.12.2017
08:14:16
если учил ооп по жабе или шарпу - лучше не лезть в питон с этой ерундой
Я правильно понимаю, что у нас ООП не настоящий каноничный джавоёбский, да и пошёл он на хуй?

Zart
08.12.2017
08:14:33
настоящий, но заметно упрощенный

но не до уровня жс/луа

Alexey
08.12.2017
08:15:19
Но всё же настоящий как полагается?

Dmitry
08.12.2017
08:15:22
настоящий, но заметно упрощенный
Упрощенный, ага про magick методы вспомни.

Zart
08.12.2017
08:15:33
а они тут при чем?

Admin
ERROR: S client not available

Alexey
08.12.2017
08:15:40
Надо для общего развития джавовский покурить что ли. Или какой посоветуешь? Где он максимально полон и каноничен?

Zart
08.12.2017
08:16:08
хз, я учил плюсовый, и крайне куце смотрел на жабу с шарпом

Dmitry
08.12.2017
08:16:26
а они тут при чем?
Ну типа в плюсах самый "настоящий" ооп. Там тоже есть операторы. Но всякой мути типа __hash__ и прочей магии нет.

Dmitry
08.12.2017
08:17:39
Это да )))

Zart
08.12.2017
08:17:57
оверлоад операторов в плюсах примерно не отличается от магических методов питона

Alexey
08.12.2017
08:18:01
в питоне множественное наследование обычно применяют для миксинов, а там алмазной проблемы тоже нет обычно
Пару раз заебавшись на наследованиях по сложности чуть сложнее, чем вся система наследников британской короны — забил хуй на такую дичь и живу с примесями.

Google
Alexey
08.12.2017
08:19:04
Ну, я за свои костыли базар держу, а так в мро всегда смотреть полезно и любопытно, как он там резолвит.

Dmitry
08.12.2017
08:20:36
оверлоад операторов в плюсах примерно не отличается от магических методов питона
Я к тому, что там явно оператор - это оператор. А в питоне, магический метод это тебе и умножить и разделить и проверить на хешируемость и конекст менеджер сделать. Приходиться платить за простоту... эмм... неявностью чтоли.

Zart
08.12.2017
08:20:52
ват

Dmitry
08.12.2017
08:23:14
class MyObj { public: // Overload + operator. MyObj operator+(const MyObj& b) { ... }

Alexey
08.12.2017
08:23:43
Тооовьс.

К получению залповой пизды от Зарта готов?

Dmitry
08.12.2017
08:25:59
Это я к тому что мало кто знает какие методы надо переопеределить чтобы такой код сработал d = dict() d[MyObj()] = 1 d[MyObj()] += 1 print(d) # {MyObj(): 2}

Alexey
08.12.2017
08:26:38
__getitem__ __setitem__ __str__ Пост закрыт.

Dmitry
08.12.2017
08:27:03
Садись два

Alexey
08.12.2017
08:27:08
Сижу, два.

Dmitry
08.12.2017
08:27:11
)))

Zart
08.12.2017
08:27:25
в питоне все вещи - объекты почти все операции над ними делегируются языком к их методам

Dmitry
08.12.2017
08:27:42
Сижу, два.
__hash__ и __eq__

Zart
08.12.2017
08:28:21
Это я к тому что мало кто знает какие методы надо переопеределить чтобы такой код сработал d = dict() d[MyObj()] = 1 d[MyObj()] += 1 print(d) # {MyObj(): 2}
хуевый аргумент кому надо переопределить, открывает доку к модулю оператор и находит нужное

Dmitry
08.12.2017
08:28:44
в питоне все вещи - объекты почти все операции над ними делегируются языком к их методам
Это тоже не правда. int только "крякает как объект". На самом-же деле он ведет себя как синглтон в некоторых случаях. Со сторками тоже самое.

Zart
08.12.2017
08:28:54
не ведет

кэширование и интернирование не делают их синглетонами

Zart
08.12.2017
08:30:03
и это фенечка одной реализации, а не языка

Dmitry
08.12.2017
08:30:37
про инты тяжело продемонстировать, про строки проще. In [1]: def a(): ...: return "foo" + 'bar' ...: In [2]: 'foobar' is a() Out[2]: True In [3]: def a(x): ...: return "foo%s" % x ...: In [4]: 'foobar' is a('bar') Out[4]: False

Страница 745 из 1719