Ответ
В 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, чтобы было понятнее, что куда передавать. Но они, блядь, чисто декоративные! Интерпретатор на них плевать хотел, он всё равно в рантайме будет делать по-своему. Но для порядка — овердохуища полезная штука.