С прагматики языка программирования, Скотт
И Python, и Ruby более гибки, чем PHP или более традиционные object- ориентированные языки в отношении содержимого (членов) класса. Новые поля могут быть добавлены в объект Python, просто присваивая им: my_object.new_field = value. Однако набор методов фиксируется при первом определении класса. В Ruby только методы видны вне класса (методы "put" и "get" должны использоваться для доступа к полям), и все методы должны быть явно объявлены. Однако можно изменить существующее объявление класса, добавив или переопределив методы. Можно даже сделать это на основе объекта object-. В результате два объекта одного и того же класса могут не отображать одинаковое поведение.
Что означает "набор методов, однако, фиксируется при первом определении класса"?
Кажется, я нашел контрпример:
>>> class E:
... pass
...
>>> E.__dict__
mappingproxy({'__module__': '__main__', '__dict__': <attribute '__dict__' of 'E' objects>, '__doc__': None, '__weakref__': <attribute '__weakref__' of 'E' objects>})
>>> def myfun():
... pass
...
>>> E.mf=myfun
>>> E.__dict__
mappingproxy({'__module__': '__main__', '__dict__': <attribute '__dict__' of 'E' objects>, '__doc__': None, '__weakref__': <attribute '__weakref__' of 'E' objects>, 'mf': <function myfun at 0x7f6561daba60>})