Ответ 1
Python - динамический язык: вы можете добавлять/удалять/изменять атрибуты и функции объектов, чтобы они соответствовали вашим потребностям. Хотя это немного полужирный, в основном объект является не чем иным, как словарем. Вы можете просто добавить атрибуты к одному объекту и т.д. Python также поддерживает - более или менее - идею утиная печать:
"Если это выглядит как утка и шарлатанцы, как утка, это утка".
Другими словами, если вы хотите, чтобы объект выглядел как другой объект, ожидаемый определенной функцией, просто дайте ему перья и ноги и удалите его вторую голову, и функция примет его.
Это один из принципов проектирования Python, и это может быть очень полезно: скажем, вы хотите исправлять функцию в фрагменте кода, который вы можете просто:
def better_function(param,eter):
#...
pass
somemodule.badfunction = better_function
и тем самым исправить код. Кроме того, если есть пакет, который, например, делает некоторые приятные вещи с веб-страницами, вы можете легко изменить его, чтобы делать что-то с помощью принтеров, переписав несколько методов.
Недостатком является то, что у вас меньше контроля над модулями, которые будут вводить ошибки (специально, я не утверждаю, что они это делают, хотя нельзя исключать злонамеренные намерения). Есть несколько способов защитить ваш код, например, сделать классы и объекты неизменяемыми: вы можете перезаписать __setattr__
и __delattr__
, которые вызываются для установки и удаления атрибута и, таким образом, затрудняют/не могут изменить объект, но это разрушит динамизм Python: программисты на Python ожидают, что они могут изменить объект.
Тяжелая защита объектов/классов/... однако противоречит принципам динамического языка. Если вам нужен язык, который гарантирует такие вещи, вам лучше использовать статически типизированный язык, например haskell.