Pythonに明示的なアクセス修飾子がないのはなぜですか:


28

「明示的が暗黙的よりも優れている」場合、Pythonには明示的アクセス修飾子がないのはなぜですか:Public、Protected、Privateなど?

プログラマーはヒントを通して何をすべきかを知っておくべきだという考えを知っています-「ブルートフォース」を使用する必要はありません。しかし、IMOの「カプセル化」または「情報隠蔽」は単に人を締め出すためだけではなく、組織と構造の問題です。物理層システムのように、開発レイヤーは明確に区切られたスコープと境界を自己定義する必要があります。

Pythonでアクセス制限が明示されているのではなく、それ以外の場合は完璧に近いと思われる言語について、なぜアクセス制限が暗黙的に含まれているのかについて、誰かがここで助けてくれますか?

編集:これまでに3つの提案された答えを見てきましたが、私の質問には2つの部分があることに気付きました。

  1. たとえば、キーワードがないのはなぜですか

    private def myFunc(): 
        dostuff....

    IMOの代わりに、typeいアンダースコアを入力します。しかし、それは重要なポイントではありません。

  2. さらに重要なことには:

    これらのアクセス修飾子が「推奨事項」またはヒントのみであり、強制されないのはなぜですか。後で変更するのは難しいでしょうか?「保護された」を「パブリック」に変更するのは非常に簡単です-複雑な継承チェーンがあり、それが難しくなると、デザインが貧弱になります-書きやすい言語機能に依存するのではなく、デザインを洗練する必要があります不十分な構造のコード。

    アクセス修飾子が適用されると、コードは自動的に区分化されます。特定のセグメントが範囲外であることを知っているので、必要な場合と必要な場合を除き、それらを処理する必要はありません。そして、あなたのデザインが良くなく、物事をさまざまな範囲に出し入れしていることに気付いた場合、言語はあなたの行為をきれいにするのに役立ちます。

Pythonが大好きなのと同じように、この2番目の点は深刻な欠陥であると感じています。そして、これに対する良い答えをまだ見ていません。


PythonでのAccess指定子の重複の可能性 ...建設的でないとして閉じられました。
フランク・シーラー

2
@フランクこれは、より建設的なことを試みるためにその質問の再質問です。先に進み、元の質問を削除しました。

@マークトラップ:ああ。説明をありがとう。閉会票を取り消す方法がわかりません。
フランク・シェラー

@フランクそれはそれ自体で老化します。
アダムリア

問題private def whateverは、それclass x: def whatever(self): passがのショートカットであるためclass x: pass; x.whatever = lambda self: pass、基本的に、割り当てにはプライベート修正子が必要になることです
-keppla

回答:


22

「明示的は暗黙的よりも優れている」は、Pythonの設計哲学における格言の1つにすぎません。「単純なものは複雑なものよりも優れています」もあります。また、PythonのZenには含まれていませんが、「ここにいる大人は全員同意しています」というのは別です。

ここで、2番目のルールがおそらく最も重要です。クラスを設計するとき、それがどのように使用されるかについていくつかの考えがあります。しかし、考えられるすべての用途を予測することはできません。それは可能私のコードのいくつかの将来の使用は、私がプライベートであると考えてきた変数へのアクセスを必要とすることになります。将来のプログラマー(または将来の私)がそれらを必要とする場合、なぜこれらにアクセスするのを難しくする必要があるのですか?最善の方法は、警告でマークすることです。Joonasが指摘しているように、単一のアンダースコアプレフィックスが標準であり、それらは内部であり、変更される可能性があります。しかし、アクセスを完全に禁止する必要はないようです。


1
Smalltalkにアクセス修飾子がないのは、「単純なものは複雑なものよりも優れています」と「私たち全員がここで同意している大人です」です。メソッドを「プライベート」カテゴリに入れることは、使用する前に3回考える必要があるというヒントです。
フランクシェラー

@Frank:「「プライベート」カテゴリにメソッドを置くことは、それを使用する前に3回考える必要があるというヒントです。私にとっては、単に私が対処していないときに心配する必要がないことを意味します。それと。
ベクトル

8
プライベートメンバーへのアクセスを禁止する正当な理由があります。クラスの不変式を壊す可能性があるためです。プライベートメンバーを記述できない場合、クラスが正しく動作することを確認できません。
svick

7
「将来のプログラマー(または将来の私でも)がそれらを必要とする場合、なぜこれらにアクセスするのを難しくする必要があるのですか?設計の基本原則の1つは、インターフェース(コードが提供するもの)と実装(それが提供する方法)の分離であるためです。カプセル化は、コードの異なる部分間の依存関係を減らすことにより、コードの複雑さを軽減するのに役立ちます。したがって、publicとprivateは、必要なものだけを表示できるようにすることで、コードを単純にする目的で使用されます。
ジョルジオ

3
これ以上は同意できません。アクセス修飾子は、カプセル化と懸念の分離という大きなソフトウェアの複雑さを減らすために、おそらく最もよく理解されている2つの概念を促進します。この2つのどちらにも役立たないということは、Pythonが優れたOOP言語ではなく、大きなソフトウェアを構築するのに適していないということを意味するだけで、何も問題はありません。しかし、「なぜ必要ないのに複雑さを追加するのか?」ただ間違っています。
ダニエルシン

10

アクセス修飾子が欠落している主な理由はシンプルであることを疑います

あなたが言うように、それは人々を締め出すことではなく、組織についてのものではないので、「プライベート」の主なポイントは、APIのユーザーにメッセージを送信することです「これに依存するコードを書かないでください」。

「慣例により、_xまたは__xをクラスの外部で使用すべきではありません」と言うのは簡単ですが、Pythonの動的オブジェクトモデルでは、表記法を考え出すことすら難しいでしょう。

class ActiveRow(object):
    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

アクセシビリティに注意する方法

これはトレードオフだったと思います。厳密にそれと一緒に暮らすことができない場合は、ルビをお勧めします。ルビは抽象化と動的性のレベルは似ていますが、アクセスの変更を可能にするオブジェクトモデルがあります。


8
これは正しいと思いますが、IMO、それはひどいです。優雅さと読みやすさをセールスポイントとして使用する言語の場合、__ method__の記述はかなり凶悪に見え、鈍感です。
ジギー

2
これは慣習で__x__はなく、「魔法」です(つまり、演算子のオーバーロード、反復性などの言語統合を可能にするために呼び出されるメソッド)。規則は_xです。
ケプラ

6
申し訳ありませんが、私はまだPythonに興味を持っています。私はそれを好むように一生懸命努力していますが、このようなものは少し厄介です。特に今では、メソッドにいくつの下線があるかという意味を覚えておく必要があります。OPのポイントには、明示的な修飾子がより明確になるようです。簡潔さは素晴らしいですが、明快さを超えることはできません。コードを構築するよりも10倍多くの労力を費やします。
ジギー

2
私の例は、アンダースコアの異なるカウントを示すことを意図したもので__init__はなく、使用は偶然でした。この例では、オブジェクトのいくつかのプロパティを設定しますが、これらはコンパイル時にわからないため、明示的なアクセス修飾子は役に立ちません。
ケプラ

5
@jiggy:「好きになろうと一生懸命努力しています」。私は2年間試しました-そしてあきらめました。:-(実際のOOP言語のように動作するようにハッキングされたスクリプト言語のように見えます。Pythonで適切に設計され、読みやすい大規模で複雑なアプリを書くことは想像できません。単純なOOPとタイプセーフの概念には、クレイジーなハックと回避策が必要です。–
ベクトル

8

Pythonの規則では、保護/プライベートメンバーにアンダースコアプレフィックスを使用します。

続くこの大会、1を除いて、アクセス修飾子として効果的に同じである)あなたが会員から直接表示されます名前、それは国民のかどうか、および2)あなたがすることができますあなたは本当に(これは正当可能にしたい場合は、「カプセル化」を破りますテストなど;他のいくつかの言語では、リフレクション==より多くのコードを使用する必要があります)。

最終的には好みの問題ですが、特別なキーワードなしで同じことを(もう少し柔軟に)できる場合、言語は小さくなり、コードはより簡潔になります。これは一般に良いことです。


2
「特別なキーワードを使用せずに同じことを(もう少し柔軟に)行える場合、言語は小さくなり、コードはより簡潔になります」私の意見では、これは一般的に真実ではありません。(アクセス修飾子の特別な場合に当てはまる場合でも)
BenjaminB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.