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 ответов

23 просмотра

>> ничего не выводит (почему не вызывается инит?) скорее вего базовая реализация создает класс не вызывая __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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта