Любое простое присвоение любому аргументу функции любая в Python ведет себя точно так же: связывает это имя с другим значением и больше ничего не делает бы то ни было. «Никакой особый случай не является настолько особенным, чтобы нарушать правила», как говорит дзен Python! -)
Таким образом, далеко не странно (что просто = присваивание определенному аргументу в определенной функции не имеет никакого внешне видимого эффекта вообще), было бы совершенно удивительно , если бы этот конкретный случай работал в любом другом Кстати, только из-за имен рассматриваемой функции и аргумента.
Если вы когда-нибудь захотите создать класс, который создает объект другого типа, чем он сам, такое поведение, конечно, вполне возможно - но оно получается путем переопределения специального метода __new__
, , а не __init__
class Test(object):
def __new__(cls):
return 5
t = Test()
print t
Этот действительно испускает 5
. Поведение __new__
/ __init__
в Python является примером шаблона проектирования «двухэтапное построение»: собственно «конструктор» равен __new__
(он создает и возвращает (обычно неинициализированный) объект (обычно новый) рассматриваемого типа / класса); __init__
- это инициализатор, который правильно инициализирует новый объект.
Это позволяет, например, создавать объекты, которые являются неизменяемыми после того, как они были построены: в этом случае все должно быть сделано за __new__
до того, как будет создан неизменный объект, поскольку, учитывая, что объект является неизменным, __init__
не может изменить его, чтобы инициализировать.