◆ export という概念がない
  ◆ 全部公開されてる
◆ python 自体に private という機能がない

JavaScript だとエクスポートするものを宣言する必要があります

[a.mjs]
const value = 10
export default {a: 1}
export const foo = 2

[main.mjs]
import * as a from "./a"

console.log(a)

[Module] { default: { a: 1 }, foo: 2 }

export してない value はみえません


python だと

[a.py]
a = 1

p = None

def x():
return 1

class C:
@staticmethod
def method():
return 2

import b

[b.py]
b_module = True

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
>>> a.a
1
>>> a.p
>>> a.q
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'a' has no attribute 'q'
>>> a.x
<function x at 0x0000023628210048>
>>> a.C
<class 'a.C'>
>>> a.C.method
<function C.method at 0x00000236282100D0>
>>> a.b
<module 'b' from 'C:\\tmp\\python\\pg\\b.py'>
>>> a.b.b_module
True

全部見えています
モジュールのグローバル空間がそのまま import で作られる変数に入る感じです
モジュールが内部で import したモジュールにもアクセスできます

Python は private というコンセプトのないオープンな作りの言語みたいです
一応 private メソッドみたいなものはありますが 完全に private じゃないです
private として扱いたいものは _ から始めるなどのマナーだけはあって private 扱いのものを使うこともできるけど使うのは使う側の責任ということらしいです

JavaScript も割とそんな感じで private という考えのない言語でした
ですが 上で書いたみたいな module では export したもの以外は private になりますし private メソッドを作る記法の提案もたしかあったはずです
一応 クロージャを使うことで隠せはするものの ほとんどは隠されてなくて そのおかげでデバッグしやすいし ライブラリを使うときだと稀に private なメソッドを参照したい例外的な場合もありますし 助かっていました

その反面 要らないのまで見えてしまうせいで必要なものが探しづらいこともあります
ただ _ から始まるのでソートされてる補完候補だとそこまで困らないですし 見えることによるメリットのほうが多いと思います
無理やり private 値を変更されて整合性取れなくておかしな動きになるなんて事はありえますが それは変更する側が悪いわけですし

そう考えると python のモジュールはけっこういい感じかなって思います