Странный вопрос, поскольку по сути модификаторы доступа имеют очень слабое отношение к инкапсуляции. Инкапсуляцию следует понимать не так, что это вообще чёрный ящик (хотя идеал именно такой, но мы же знаем, что идеалов не бывает). Инкапсуляция, это когда такой код:
class Foo:
A = None
foo = Foo()
# some code here
if foo.A is not None:
# continue execute right way
else:
exit(1)
становиться каким-то таким:
class Foo:
class PropertyUsedBeforeInit(Exception):
pass
_a = None
@property
def a(self):
if self._a is not None:
return self._a
else:
raise self.PropertyUsedBeforeInit()
@property.setter
def a(self, val):
self._a = val
try:
foo = Foo()
# just write ur code here
except Foo.PropertyUsedBeforeInit:
exit(1)
finally:
exit(0)
Этот пример довольно синтетический, поэтому "лучший" вариант больше в размерах, однако, полезно заметить, что стоит добавить классов, добавить свойств, добавить вариантов вылета, как второй вариант внезапно становиться...
Хотя, на самом деле, на вкус и цвет друзей нет. Python крут тем, что он многогранен. Его можно использовать в тяжёлом энтерпрайзе (второй вариант), его можно использовать и для лабораторных в универе (первый вариант), его можно использовать и для домашних проектов (любой вариант). Его можно использовать везде. Его можно компилировать во что угодно. И его архитектура устроена именно таким образом - дать свободу. А модификаторы доступа - это то, за чем в общем-то должен следить программист. А соглашения помогают разрабатывать и использовать модули (библиотеки).
Ну, а по поводу того, кто круче. На моё "ИМХО", Python таки в чём-то круче. В нём реализованы те вещи, которых нет в C++ и Java вместе взятые и при этом они реализованы лаконично и прозрачно. Взять те же декораторы: очень простая штука. Ну просто невероятно простая. А имеем что? Очень мощный инструмент. Плюсам и джавам потребовалось бы невероятное усилие, чтобы реализовать что-то подобное. Да что там, они анонимную функцию делали сто лет.