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.
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
Wie machen Sie ein Methodenmodul oder eine Bibliothek privat? –
@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