из инитов?
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'?
>> ничего не выводит (почему не вызывается инит?) скорее вего базовая реализация создает класс не вызывая __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__ - не знаю.
спасибо, всё сложнее в общем чем думал надо будет почитать во Fluent Python
> В твоем случае, у B нет своего new, поэтому вызывается type("B", (A, ), {}) То есть налету создается новый класс с __class__.__name__ == "B", который наследник А, а у А нет методов, которые ты описал в В Не, совсем не то >>> a = B.__new__(A) >>> type(a) is A True
Обсуждают сегодня