Какая концепция типизации используется в Python?

Ответ

В Python используется утиная типизация (duck typing). Это означает, что тип объекта определяется его поведением (наличием определённых методов и атрибутов), а не явным наследованием или интерфейсом. Если объект 'крякает как утка и ходит как утка', то он считается уткой.

Такой подход обеспечивает высокую гибкость, позволяя работать с различными типами объектов через общий интерфейс, не требуя строгой иерархии классов.

Пример:

class Bird:
    def fly(self):
        print("Птица летит")

class Airplane:
    def fly(self):
        print("Самолёт взлетает")

def make_it_fly(obj):
    # Не важно, Bird или Airplane — главное, что у объекта есть метод fly()
    obj.fly()

make_it_fly(Bird())     # Вывод: Птица летит
make_it_fly(Airplane()) # Вывод: Самолёт взлетает

Помимо утиной типизации, Python также поддерживает:

  • Динамическая типизация: Типы переменных определяются и проверяются во время выполнения программы.
  • Строгая типизация: Неявные преобразования типов минимизированы, что предотвращает неожиданное поведение (например, 1 + "1" вызовет ошибку TypeError).
  • Аннотации типов (с Python 3.5+): Позволяют добавлять подсказки о типах для улучшения читаемости кода и статического анализа, но не влияют на поведение программы во время выполнения.

Ответ 18+ 🔞

А, слушай, вот эта штука в Python — утиная типизация, ну это ж просто пиздец как удобно, ей-богу! Суть в чём: нам похуй, что это за объект на самом деле, главное — чтобы он умел делать то, что нам нужно. Если он крякает как утка и ходит как утка — значит, он у нас утка, блядь! Не надо никаких бумажек, наследств и прочей бюрократии.

Вот смотри, на примере — сразу всё понятно станет, как два пальца обоссать.

class Bird:
    def fly(self):
        print("Птица летит")

class Airplane:
    def fly(self):
        print("Самолёт взлетает")

def make_it_fly(obj):
    # Нам по барабану, Bird или Airplane — лишь бы метод fly() был
    obj.fly()

make_it_fly(Bird())     # Вывод: Птица летит
make_it_fly(Airplane()) # Вывод: Самолёт взлетает

Видишь? Одна функция работает и с птицей, и с самолётом. Потому что им обоим не в падлу уметь летать. Вот и вся философия, в рот меня чих-пых!

Ну и, конечно, Python же ещё и динамически типизированный, это ж его конёк. Тип переменной выясняется прямо во время работы программы, а не заранее. И типизация строгая, слава богу — не будет тут никаких подлянок вроде 1 + "1" без твоего ведома, сразу получишь TypeError в ебало, чтобы не выёбывался.

А ещё есть аннотации типов, с версии 3.5. Это такие намёки-подсказки для тебя самого и для твоих IDE, чтобы было понятнее, что куда передавать. Но они, блядь, чисто декоративные! Интерпретатор на них плевать хотел, он всё равно в рантайме будет делать по-своему. Но для порядка — овердохуища полезная штука.