Python динамически типизирован : все переменные могут ссылаться на объект любого типа. id
и name
могут быть чем угодно, но фактические объекты имеют типы типа int
и str
. 0
- это литерал, который анализируется для создания объекта int
, а 'John'
- литерал, который создает объект str
. Многие типы объектов не имеют литералов и возвращаются вызываемым объектом (например, frozenset
- нет способа создать литерал frozenset, вы должны вызвать frozenset
.)
Следовательно, не существует такого понятия, как объявление переменных, поскольку вы ничего не определяете относительно переменной. id = 0
и name = 'John'
являются просто назначением.
increase
возвращает int
, потому что это то, что вы возвращаете в нем; ничто в Python не заставляет его быть другим объектом. first
и second
- только целые числа, если вы их сделаете.
Объекты, в определенной степени, имеют общий интерфейс. Вы можете использовать одни и те же операторы и функции на всех них, и если они поддерживают эту конкретную операцию, это работает. Это распространенный, рекомендуемый метод использования различных типов, которые ведут себя одинаково взаимозаменяемо; это называется утка, набрав . Например, если что-то принимает объект file
, вы можете вместо этого передать объект cStringIO.StringIO
, который поддерживает тот же метод, что и файл (например, read
и write
), но это совершенно другой тип. Это похоже на интерфейсы Java, но не требует формального использования, вы просто определяете соответствующие методы.