170 похожих чатов

Что-То не так видимо понял 1) почему не вызывается ни один

из инитов?
2) почему, хотя мы вывали __new__ класса B, нет его метода?

class A:
def __init__(self):
print("init a")

def show_a(self):
print("a")

class B:
def __init__(self):
print("init b")

def show_b(self):
print("b")


a = B.__new__(A) # ничего не выводит (почему не вызывается инит?)
a.show_a() # a
a.show_b()

#Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# AttributeError: 'A' object has no attribute 'show_b'. Did you mean: 'show_a'?

3 ответов

8 просмотров

>> ничего не выводит (почему не вызывается инит?) скорее вего базовая реализация создает класс не вызывая __init__. Памятуя, что все в питоне наследник object, а он наследник type, а последний - конструктор классов на лету, то object.__new__(A) выполняет что-то вроде type("A", (A, ), {...}) не вызывая твой A.__init__. Но это надо исходники питона смотреть так-то. В твоем случае, у B нет своего new, поэтому вызывается type("B", (A, ), {}) То есть налету создается новый класс с __class__.__name__ == "B", который наследник А, а у А нет методов, которые ты описал в В — Если интересно: class A: def __init__(self): print("init A") object.__new__ is type.__new__ # False A.__new__ is object.__new__ # True Но что там под капотом у object.__new__ и type.__new__ - не знаю.

Сергей- Автор вопроса
Wanna_Phonila
>> ничего не выводит (почему не вызывается инит?) ...

спасибо, всё сложнее в общем чем думал надо будет почитать во Fluent Python

Wanna_Phonila
>> ничего не выводит (почему не вызывается инит?) ...

> В твоем случае, у B нет своего new, поэтому вызывается type("B", (A, ), {}) То есть налету создается новый класс с __class__.__name__ == "B", который наследник А, а у А нет методов, которые ты описал в В Не, совсем не то >>> a = B.__new__(A) >>> type(a) is A True

Похожие вопросы

Обсуждают сегодня

Всем привет. Ребят подскажите пожалуйста. Вопрос по дизасемблировани. Начну с начала. У меня есть скомпилированная программа на ГО (я разработчик) - в ней есть защита лицензии...
Zloy
11
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
0
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Заметил в ghci 9.4.8: > :t (<*>) @((->)_) (<*>) @((->)_) :: (w -> (a -> b)) -> (w -> a) -> w -> b Разве не должно (w -> (a -> b)) быть записано как (w -> a -> b)? Это баг, ил...
Михаил
13
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Или ты челендж хочешь?
Ilya Shvechikov
7
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Карта сайта