LINUX.ORG.RU

А что конкретно не понятно?

Bad_ptr ★★★★★
()

вобщем это всё от динамичности. Думай об этом что оно всё в рантайме происходит.

Bad_ptr ★★★★★
()
Ответ на: комментарий от x0r

наверное, не понятно почему в A можно вызвать метод из B, если в сигнатуре никакого B нету. Справедливый вопрос для людей без питона головного мозга))

stevejobs ★★★★☆
()

сначало «подставилось» то есть написалось

class C(): def __init__(self): self.Bfunc() def Bfunc(self): print «Bfunc»

потом «исполнилось»

drF_ckoff ★★
()
Ответ на: комментарий от drF_ckoff

но это же не должно работать! я так думаю. И думал, пока не сделал «ошибку» которая оказалась не ошибкой.

Berluskoni ★★
() автор топика
Ответ на: комментарий от Deleted

Мне кажется, что эта тема не стоит Development, но я не знаю как перенести.

Berluskoni ★★
() автор топика
Ответ на: комментарий от Berluskoni

Почему не должно? Ты же вызываешь из C, который знает и про A, и про B. А компилируется оно потому, что язык динамический, и ему глубоко плевать, что там в self. Раз вызывают, значит наверное есть. Будем выполнять - там разберёмся.

Xellos ★★★★★
()
Ответ на: комментарий от Xellos

я к тому, что A про B ничего не знает! В этом суть) Как именно оно работает я понимаю, но вот зачем так сделано понять не могу.

Berluskoni ★★
() автор топика

Поиск метода Bfunc у объекта происходит в рантайме. А как ищутся методы в python? А очень просто, у любого объекта есть словарь __dict__, хранящий имеющиеся методы, в котором, при вызове метода, ищется вызываемый метод и исполняется, если нашли. Так что всё ок, т.к. метод Bfunc имеется у C.

Norgat ★★★★★
()

перефразирую - я не понимаю, почему именно так сделано. Получается, что метод А без С неработоспособен и будет выдавать ошибку.

Berluskoni ★★
() автор топика
Ответ на: комментарий от Berluskoni

Она вызывается не в A, а в C, просто выполняется тот вариант функции __init__, который унаследован из A. И этот вариант ищет у себя (а мы говорим о классе C) функцию Bfunc и находит её в той части, что унаследована от B.

Если не ошибаюсь, так поступают все динамические языки - в том числе и компилируемые.

quiet_readonly ★★★★
()
Ответ на: комментарий от Berluskoni

Для этого существует документация и комментарии. Да и применяется не часто, так что всё окей с этим.

Norgat ★★★★★
()
Ответ на: комментарий от Berluskoni

основная мысль - зачем так сделано

Это возможно потому что нету проверки типов.
Когда ты пишешь class A: def init(self) self.bfunk() <- здесь self неизвестного типа, нельзя проверить содержит ли self bfunk или нет.

Bad_ptr ★★★★★
()
Ответ на: комментарий от Berluskoni

Зависит от среды и её умения выдавать варнинги в таких ситуациях. Можно например поступать как clang с макросами - если в них явная ошибка, наплевать до тех пор, пока макрос не инстанцируется - а потом поставить курсор ошибки где-то в теле макроса.

Т.е. среда видит вызов конструктора c = C() и ничего не показывает, всё ок; видит a = A() - и создаёт предупреждение с курсором на __init__ класса A.

quiet_readonly ★★★★
()
Ответ на: комментарий от Berluskoni

функция

ололо. как ты не инстанцируеш А через A.__init__(self).

x0r ★★★★★
()

ты упоролся такой код писать

и да, в топике тебе все разъяснили

по поводу читаемости: если упоротые люди пишут код, то он в любом случае будет нечитаемым.

hatefu1_dead
()
Ответ на: комментарий от Berluskoni

>а с++ для меня эталон логичности

Готовь броню, тут может быть битва. Сегодня ещё и пятница (^ ^)

Deleted
()
Ответ на: комментарий от cadaber

что значит нет? если 2 класса никак не связаны логически, то и методы друг-друга использовать не должны!

Berluskoni ★★
() автор топика
Ответ на: комментарий от Berluskoni

прекрати троллить, люби и воспринимай питон таким как он есть

amazpyel ★★★
()
Ответ на: комментарий от Berluskoni

ололошка, я в питоне могу любую функцию к объекту привязать, и он сможет ее использовать как метод. можно еще к классу привязать, тогда любой экземпляр сможет ее использовать. и это хорошо. так что заканчивай плюсы с питоном сравнивать - это разные языки с разными возможностями.

hatefu1_dead
()
Ответ на: комментарий от Bad_ptr

здесь self неизвестного типа, нельзя проверить содержит ли self bfunk или нет.

Но если очень хочется, то

class A(object):
        def __init__(self):
            if isinstance(self, B):
                self.Bfunc()
или
class A:
        def __init__(self):
            if hasattr(self, 'Bfunc') and hasattr(self.Bfunc, '__call__'):
                self.Bfunc()

Bad_ptr ★★★★★
()

Ну, вот пример из реальной жизни.

Есть class Base, в котором написан обработчик, который выполняет в нужном месте цепочку методов (_get_blah, _get_blahblah etc). Заранее он не знает, какие методы.

Я от него наследую и добавляю конкретные методы _get_..., которые мне надо, и он их исполняет, а код, исполняющий их, хранится отдельно в классе Base

michwill ★★★★★
()
Ответ на: комментарий от Berluskoni

Получается, что питон неработоспособен и будет выдавать ошибку.

Вот так лучше.

note173 ★★★★★
()
Ответ на: комментарий от Berluskoni

Ты первый раз в жизни увидел динамический язык? Или ты тупишь? Или нарываешься на -20?

Xellos ★★★★★
()
Ответ на: комментарий от Berluskoni

с++ для меня эталон логичности.

Это язык в котором чтение и запись достигается при помощи битового сдвига потоков ввода-вывода?

Absurd ★★★
()

ужасы динамических языков

RedPossum ★★★★★
()
Ответ на: комментарий от Absurd

Это язык в котором чтение и запись достигается при помощи битового сдвига потоков ввода-вывода?

Не осиливаешь больше одного значения для каждого операнда? А вычитание и отрицательные числа тебя тоже в ступор вводят?

Dragon59 ★★
()
Ответ на: комментарий от Berluskoni

если 2 класса никак не связаны логически, то и методы друг-друга использовать не должны!

Именно поэтому никто и не любит множественное наследование.

buddhist ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.