2017-06-29 3 views
3

Angenommen, ich habe eine Klasse Task und eine andere Klasse Subtask, an die die Ausführung einer bestimmten Aufgabe delegiert ist, aber immer im Kontext einer Task Ausführung. Das bedeutet, die Subtask nimmt immer ein Task, und es führt Aktionen auf der Tasks ‚s Attribute:Beschränken interne interne Methode Anrufer

class Task: 
    pass 

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

    def run(self): 
     # performs actions on self.task own attributes 

Dann stellen wir ein Verfahren in Task haben, die ein bestimmtes Update macht. Diese Methode soll nur für den internen Gebrauch verwendet werden:

class Task: 
    def _update(self): 
     # do something restricted 

Aber dann wollen wir eigentlich aus dem Subtask zum Aufrufen dieser Methode diese Aktualisierungen auszuführen:

class Subtask: 
    def run(self): 
     # do stuff 
     self.task._update() 

Hier ist die Frage: Dies ist ein unregelmäßiges Verhalten. Eine interne Verwendung nur Methode sollte nicht aus einem anderen Kontext aufgerufen werden, und die IDE gibt eine entsprechende Warnung wie erwartet.

Ich möchte jedoch nicht die Methode public, Task.update() machen, weil es immer noch von eingeschränkter Verwendung ist. Wir wollen einfach so etwas wie Freundschaft machen, wie man es in C++ findet.

Wir möchten, dass Task._update() Methode private behalten, aber geben Sie der Klasse eine besondere Erlaubnis.

Gibt es eine Möglichkeit, dies zu tun?

PS: Ich weiß, wie Python funktioniert, ich weiß, dass ich von außen diese Methode verwenden kann und die Warnung ignorieren, oder es öffentliche machen und einfach tue es nicht an anderer Stelle verwenden, zusammenfassen: verantwortlich sein, wie es das Motto Python verkündet. Ich stimme dem zu, aber ich frage mich auch, ob es irgendwie möglich ist, das zu erreichen, wonach ich suche, und zwar auf eine Weise, die mit der Python-Philosophie Sinn macht.

+1

Führender Unterstrich bedeutet nicht Klasse-privat. Es ist so privat, wie Sie es behandeln möchten. Es ist oft sinnvoller, sie als module-private oder my-library-private zu behandeln, als die Grenzen in Klassenlinien zu ziehen. – user2357112

+0

Wie machen Sie ein Methodenmodul oder eine Bibliothek privat? –

+1

@LiamBohl: Du machst es nicht privat. Du behandelst es einfach so. Ein führender Unterstrich weist normalerweise darauf hin, dass das so genannte Ding ein Implementierungsdetail ist, aber es bedeutet nicht, dass alle Zugriffe auf dieses Implementierungsdetail in derselben Klasse stattfinden sollten. Verdammt, die führende Unterstrichkonvention ist nicht darauf beschränkt, innerhalb von Klassen aufzutreten; Beispielsweise sollte eine Funktion auf Modulebene mit einem führenden Unterstrich ebenfalls als Implementierungsdetail betrachtet werden. – user2357112

Antwort

0

Ich glaube, die meisten Pythonic Lösung wäre, private Variablen zu verwenden, da sie überall zugänglich sind, wenn Sie explizit sind.

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