bob = Person1('bob', 25)
действительно эквивалентно чему-то вроде
rv = Person1.__new__(Person1, 'bob', 25)
if isinstance(rv, Person1):
rv.__init__('bob', 25)
bob = rv
Вызов класса не сразу вызывает метод __init__
. Метод __new__
класса вызывается первым для фактического создания нового экземпляра, а , если __new__
возвращает экземпляр класса, переданный в качестве первого аргумента, , тогда __init__
вызывается перед возвратом значения.
Если пойти еще дальше, все это инкапсулировано в type.__call__
, так что на самом деле вызов Person1('bob', 25)
- это что-то вроде
bob = type.__call__(Person1, 'bob', 25) # Person1 is an instance of type
, где type.__call__
- это то, что вызывает Person1.__new__
и, при необходимости, Person.__init__
, и возвращает полученный объект для присвоения ему bob
.