クラスTask
と特定のタスクの実行が委任されていますが、常にTask
の実行である別のクラスSubtask
があるとします。これはSubtask
を意味常にTask
を取り、それがTasks
の属性上のアクションを実行します。内部使用方法の呼び出しを制限する
class Task:
pass
class Subtask:
def __init__(self, task):
self.task = task
def run(self):
# performs actions on self.task own attributes
その後、我々は、特定のアップデートを行いTask
のメソッドを持っています。
class Task:
def _update(self):
# do something restricted
しかし、その後、私たちは、実際にそれらの更新を実行するSubtask
からこのメソッドを呼び出したい::このメソッドは、内部でのみ使用するために使用されることを想定している。ここ
class Subtask:
def run(self):
# do stuff
self.task._update()
は問題である:これは不規則な行動。 内部使用のみメソッドを別のコンテキストから呼び出すべきではなく、IDEが対応する警告を期待どおりに提供します。
ただし、まだ限定されているので、公開,Task.update()
という方法を使用したくありません。私たちはちょうどC++のような友情をしたいと思っています。
Task._update()
メソッドをプライベートにしますが、Subclass
クラスに特別な許可を与えます。
これを行う方法はありますか?
PS:私はPythonがどのように動作するかを知って、私はちょうど外からそのメソッドを使用して警告を無視、またはそれ公共作ると簡単に要約すると、他の場所でそれを使用していないことを知っ:は、責任を負うことそれはPythonが宣言するモットーである。私はこれに同意しますが、Pythonの哲学に合った方法で私が達成したことが達成できる方法があるかどうかも疑問です。
先頭のアンダースコアは、クラスプライベートを意味しません。それはあなたがそれを扱いたいほどプライベートです。それをモジュールプライベートやマイライブラリプライベートとして扱うことは、クラスラインで境界線を描くよりもしばしば意味があります。 – user2357112
メソッドモジュールまたはライブラリプライベートはどのようにして作成しますか? –
@LiamBohl:あなたはそれをプライベートにすることはありません。あなたはちょうどそのように扱います。先行するアンダースコアは、そのように指定されたものが実装の詳細であることを示していますが、その実装の詳細へのすべてのアクセスが同じクラスで発生する必要はありません。ヘック、先頭のアンダースコアのコンベンションは、クラス内での発生に限定されません。たとえば、先頭にアンダースコアを付けたモジュールレベルの関数も実装の詳細と考えるべきです。 – user2357112