как значение передается из метода __init__ в pyhton, поскольку оно не возвращает ничего - PullRequest
0 голосов
/ 03 февраля 2020
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

bob = Person1('bob', 25)

__init__ ничего не возвращает, так как значения свойств name и age передаются из функции __init__ в переменную bob после присвоения свойств name и age пустому объекту self

1 Ответ

4 голосов
/ 03 февраля 2020

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.

...