2017-06-29 10 views
3

クラス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の哲学に合った方法で私が達成したことが達成できる方法があるかどうかも疑問です。

+1

先頭のアンダースコアは、クラスプライベートを意味しません。それはあなたがそれを扱いたいほどプライベートです。それをモジュールプライベートやマイライブラリプライベートとして扱うことは、クラスラインで境界線を描くよりもしばしば意味があります。 – user2357112

+0

メソッドモジュールまたはライブラリプライベートはどのようにして作成しますか? –

+1

@LiamBohl:あなたはそれをプライベートにすることはありません。あなたはちょうどそのように扱います。先行するアンダースコアは、そのように指定されたものが実装の詳細であることを示していますが、その実装の詳細へのすべてのアクセスが同じクラスで発生する必要はありません。ヘック、先頭のアンダースコアのコンベンションは、クラス内での発生に限定されません。たとえば、先頭にアンダースコアを付けたモジュールレベルの関数も実装の詳細と考えるべきです。 – user2357112

答えて

0

あなたが明示的であればどこでもアクセスできるので、最もPythonicな解決策は私用変数を使うことだと思います。

class Task: 
    def __update(self): # Two underscores for private 
     # do something restricted 

class Subtask: 
    def __init__(self, task): 
     self.task = task 

    def run(self): 
     # Do stuff 
     self.task._Task__update() # Access private method 
関連する問題