
Дмитрий
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
по плюсам

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

Roman
08.12.2017
08:07:09

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

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__ и прочей магии нет.

Zart
08.12.2017
08:16:36
дельфи еще

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

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

Alexey
08.12.2017
08:18:01

Zart
08.12.2017
08:18:31

Google

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

Dmitry
08.12.2017
08:20:36

Zart
08.12.2017
08:20:52
ват

Alexey
08.12.2017
08:21:09

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__
Пост закрыт.

Lulz
08.12.2017
08:26:59

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

Zart
08.12.2017
08:28:21

Dmitry
08.12.2017
08:28:44

Zart
08.12.2017
08:28:54
не ведет
кэширование и интернирование не делают их синглетонами

dmks
08.12.2017
08:29:55

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