2017-12-16 10 views
0

Ähnlich wie in anderen Sprachen wie Dlang, wo Sie Funktionen mit den gleichen Namen definieren können; aber verschiedene Signaturen, so dass der Compiler unterscheiden kann, auf welche Funktion sich mehrdeutige Funktionsaufrufe beziehen.eine Möglichkeit, eine Klasse mit zwei Methoden mit demselben Namen zu erstellen, aber eine ist statisch und die andere ist eine Klassenmethode.

Ich hatte den Gedanken, dass Sie irgendwie Eigenschaften nachahmen könnten, weil sie Ihnen erlauben, auf der gleichen Funktion zu handeln, aber unterschiedliche Eingänge verwenden und unterschiedliche Ausgänge erhalten. Aber da das @property-Tag nicht Python ist, und es in C neu zu erstellen, ist nichts sehr machbares noch effizientes arbeitsweises; Ich suche eine Möglichkeit, es entweder rein oder mit 3rd-Party-Bibliotheken zu tun.

class Socket: 
    def __init__(self, ip, port, auto_connect=False): 
     self.ip = ip 
     self.port = port 
     self.sockfd = socket.socket() 
     if auto_connect: 
      self.connect() 

    @staticmethod 
    def static_connect(sockfd, ip, port): 
     sockfd.connect((ip, port)) 

    def connect(self): 
     self.sockfd.connect((self.ip, self.port)) 

Ich habe Figur auch, dass Sie nur die Funktionen anders nennen könnten, aber ich diesen Ansatz einfach nicht mögen, da es den Benutzer zu wissen, beinhaltet, dass die sekundäre Funktion existiert und zwar sinnvoll, nicht mein Stil.

Auch habe ich mir vorschlagen, dass ich etwas entlang der Linien von dies tun könnte:

Klasse Sockel: ... def verbinden (self, ip, port): ""“ Bei der Verwendung von statisch: self = Buchse ip = ip port = Port wenn er als Klassenmitglied mit: ip = ip & port = Port ""“

if isinstance(self, types.ClassType): 
     self.sockfd.connect((ip, port)) 
     return 
    self.connect((ip, port)) 

Aber das ist nur unnatürlich und könnte zu Verwirrung führen, wenn jemand den Code liest, und ist unpythonisch.

HINWEIS: Diese Funktion repliziert das in here gezeigte Verhalten, aber es gelingt glücklicherweise, alle Parameter zu verwenden, und daher sind keine optionalen Parameter erforderlich, also entschuldige mich dafür, es nicht explizit zu erwähnen, aber meine Frage verlangt keinen Weg es mit Schlüsselwortargumenten.

tl; dr:

Klasse Funktionen, die verschiedenen Signaturen z.B .: statische Methode, aber nicht ersetzt jedes anderes und doch noch in geeigneter Weise

+0

Mögliche Duplikate von [Wie verwende ich Methode überladen in Python?] (Https://stackoverflow.com/questions/10202938/how-doi-use-method-overloading-in-python) –

Antwort

0

Wie sei es ein Verfahren mit Standard-Schlüsselwort-Argumenten aufgerufen werden?

class Socket: 
    def __init__(self, ip, port, auto_connect=False): 
     self.ip = ip 
     self.port = port 
     self.sockfd = socket.socket() 
     if auto_connect: 
      self.connect() 

    def connect(sockfd=self.sockfd, ip=self.ip, port=self.port): 
     sockfd.connect((ip, port)) 

gebenen Argumente werden Standardwerte außer Kraft setzen, aber ansonsten, wenn es ohne Argumente aufgerufen wird seine Standardparameter verwenden.

Ist das eine Lösung, die für Sie arbeiten kann?

+0

Ich sprach über die Methode später in meinem Beitrag; Aber das ist nicht das, was ich gerne machen würde. Ich würde gerne das Verhalten von etwas wie '@ property' replizieren, aber ich fange an zu denken, dass es der einzig richtige Weg ist, es zu tun, ohne in Interna zu tauchen. –

+0

Ich bin mir ziemlich sicher, dass dies die richtige Methode ist, um das Überladen von Methoden in Python zu implementieren (ausgenommen Bibliotheken von Drittanbietern, aber das geht einfach über das Top-Imo hinaus). –

Verwandte Themen