Inhaltsverzeichnis
Was ist eine „generische Methode“?
Zum Beispiel
一般实现
有没有更好的方式?
缺点
#1 单分派
#2 不支持 typing
替代方案:multimethod 库
优势
更更好的实践方式
究极好的实践方式(真正的方法重载)
#1 Einzelversand
#2 unterstützt keine Eingabe
Heim Backend-Entwicklung Python-Tutorial So definieren Sie die Überladung mehrerer Konstruktormethoden und generische Methoden in Python-Klassen

So definieren Sie die Überladung mehrerer Konstruktormethoden und generische Methoden in Python-Klassen

May 09, 2023 pm 02:34 PM
python

    Was ist eine „generische Methode“?

    Eine Methode, die aus mehreren Methoden besteht, die denselben Vorgang für verschiedene Typen implementieren.

    Zum Beispiel

    Jetzt gibt es eine Anforderung, die erfordert, dass Sie eine benutzerdefinierte Datumsklasse (CustomDate) auf folgende Weise erstellen: CustomDate):

    • 时间戳

    • 年、月、日(包含三个整数的元组)

    • ISO 格式的字符串

    • Datetime

    一般实现

    from datetime import date, datetime
    class CustomDate:
        def __init__(self, arg):
            if isinstance(arg, (int, float)):
                self.__date = date.fromtimestamp(arg)
            elif isinstance(arg, tuple) and len(arg) == 3 and all(map(lambda x: isinstance(x, int), arg):
                self.__date = date(*arg)
            elif isinstance(arg, str):
                self.__date = date.fromisoformat(arg)
            elif isinstance(arg, datetime):
                self.__date = datetime.date()
            else:
                raise TypeError("could not create instance from " + type(arg).__name__)
        @property
        def date():
            return self.__date
    Nach dem Login kopieren

    注:这里暂不讨论传入的日期/时间戳合不合法,仅仅只对类型做大致判断。

    有没有更好的方式?

    我们可以将不同的构建方式拆分为多个方法,并利用 functools 中的 singledispatchmethod 装饰器来根据传入的参数类型决定调用哪个方法。

    from datetime import date, datetime
    from functools import singledispatchmethod
    class CustomDate:
        @singledispatchmethod
        def __init__(self, arg):
            raise TypeError("could not create instance from " + type(arg).__name__)
        @__init__.register(int)
        @__init__.register(float)
        def __from_timestamp(self, arg):
            self.__date = date.fromtimestamp(arg)
        @__init__.register(tuple)
        def __from_tuple(self, arg):
            if len(arg) == 3 and all(map(lambda x: isinstance(x, int), arg)):
                self.__date = date(*arg)
            else:
                raise ValueError("could not create instance from a malformed tuple")
        @__init__.register(str)
        def __from_isoformat(self, arg):
            self.__date = date.fromisoformat(arg)
        @__init__.register(datetime)
        def __from_datetime(self, arg):
            self.__date = arg.date()
        @property
        def date(self):
            return self.__date
    Nach dem Login kopieren

    这样一来,我们便能将每种参数类型的初始化独立成一个个的方法了。

    缺点

    #1 单分派

    在调用期间应该使用哪个方法实现由分派算法决定。如果该算法只基于单个参数的类型来决定使用哪个方法实现,则称其为单分派。

    singledispatchmethod 就是就是单分派的。也就是说,只有第一个参数会作为考量。这在实际业务中是远远不足的。

    #2 不支持 typing

    然而,如上,对元组中元素类型判断还是需要我们用 if/else 实现。也就是说,我们不能使用 typing.Tuple[int, int, int]

    作为一种折中的方案,或许我们可以定义一个 ThreeIntTuple 类来对其进行限定,将这些判断从 CustomDate 类中隔离开来。

    这里仅提供一个思路让大家参考,我就不实现了(因为我们有更好的方式 xD)。

    替代方案:multimethod 库

    这个库不是标准库之一,需要通过 pip 安装:

    pip install multimethod
    Nach dem Login kopieren

    优势

    multimethod 采用的是多分派算法,能更好地满足更复杂的场景。此外,该库对 typing 中的类型也有不错的支持。

    更更好的实践方式

    回到上面的问题,我们可以这么改进:

    • 使用 multimethod 方法来替代 singledispatchmethod

    • 使用 Tuple[int, int, int] 来替代 tuple,不再需要手动校验元组的长度和元素类型了;

    from datetime import date, datetime
    from typing import Tuple, Union
    from multimethod import multimethod
    class CustomDate:
        @multimethod
        def __init__(self, arg):
            raise TypeError("could not create instance from " + type(arg).__name__)
        @__init__.register
        def __from_timestamp(self, arg: Union[int, float]):
            self.__date = date.fromtimestamp(arg)
        @__init__.register
        def __from_tuple(self, arg: Tuple[int, int, int]):
            self.__date = date(*arg)
        @__init__.register
        def __from_isoformat(self, arg: str):
            self.__date = date.fromisoformat(arg)
        @__init__.register
        def __from_datetime(self, arg: datetime):
            self.__date = arg.date()
        @property
        def date(self):
            return self.__date
    Nach dem Login kopieren

    究极好的实践方式(真正的方法重载)

    在此之前,先问大家一个简单的问题(这跟我们之后的内容有很大的联系):

    class A:
        def a(self):
            print(1)
        def a(self):
            print(2)
    A().a()
    Nach dem Login kopieren

    以上这段代码会输出什么?还是会抛出错误?

    输出 2

    在 Python 中,如果定义了重名的方法,最后一个方法是会覆盖掉之前的方法的。

    但你或许不知,我们可以通过元类(metaclass)来改变这一行为:

    class MetaA(type):
        class __prepare__(dict):
            def __init__(*args):
                pass
            def __setitem__(self, key, value):
                if self.get('a'):  # Line 7
                    super().__setitem__('b', value)  # Line 8
                else:	
                    super().__setitem__(key, value)
    class A(metaclass=MetaA):
        def a(self):
            print(1)
        def a(self):
            print(2)
    A().a()  # => 1
    A().b()  # => 2  # Line 22
    Nach dem Login kopieren

    在第 7 和第 8 行,我们将重名的 a 方法改名为 b,并在第 22 行成功地调用它了。

    multimethod 的维护者们很好地运用了这一点,对重名的方法进行了处理,以达到一种“特殊的效果”。

    回到正题,我们可以做出如下改进:

    • multimethod.multidata 设置为 CustomDate 类的元类;

    • 将所有方法命名为 __init__

        < li>

        Zeitstempel
    • Jahr, Monat, Tag (Tupel mit drei ganzen Zahlen)

      🎜
    • 🎜ISO-Formatzeichenfolge🎜🎜
    • 🎜Datetime</code > Allgemeine Implementierung der Klasse 🎜 🎜🎜🎜🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>from datetime import date, datetime from typing import Tuple, Union from multimethod import multimeta class CustomDate(metaclass=multimeta): def __init__(self, arg: Union[int, float]): self.__date = date.fromtimestamp(arg) def __init__(self, arg: Tuple[int, int, int]): self.__date = date(*arg) def __init__(self, arg: str): self.__date = date.fromisoformat(arg) def __init__(self, arg: datetime): self.__date = arg.date() def __init__(self, arg): raise TypeError(&quot;could not create instance from &quot; + type(arg).__name__) @property def date(self): return self.__date</pre><div class="contentsignin">Nach dem Login kopieren</div></div>🎜 Hinweis: Wir werden nicht diskutieren, ob der eingehende Datums-/Zeitstempel legal ist oder nicht, sondern nur eine grobe Beurteilung des Typs vornehmen. 🎜🎜Gibt es einen besseren Weg? 🎜🎜Wir können verschiedene Erstellungsmethoden in mehrere Methoden aufteilen und den <code>singledispatchmethod-Dekorator in functools verwenden, um basierend auf dem Typ der übergebenen Parameter zu entscheiden, welche Methode aufgerufen werden soll. 🎜rrreee🎜Auf diese Weise können wir die Initialisierung jedes Parametertyps in separate Methoden aufteilen. 🎜🎜Nachteile🎜
      #1 Einzelversand
      🎜Welche Methodenimplementierung während des Aufrufs verwendet werden soll, wird durch den Versandalgorithmus bestimmt. Wenn der Algorithmus nur anhand des Typs eines einzelnen Parameters entscheidet, welche Methodenimplementierung verwendet werden soll, spricht man von Single Dispatch. 🎜🎜singledispatchmethod ist Einzelversand. Das heißt, es wird nur der erste Parameter berücksichtigt. Das reicht in der Praxis bei weitem nicht aus. 🎜
      #2 unterstützt keine Eingabe
      🎜Wie oben erwähnt müssen wir jedoch immer noch if/else verwenden, um den Typ der Elemente in zu bestimmen ein Tupel. Das heißt, wir können typing.Tuple[int, int, int] nicht verwenden. 🎜🎜Als Kompromiss können wir vielleicht eine ThreeIntTuple-Klasse definieren, um sie einzuschränken und diese Urteile von der CustomDate-Klasse zu isolieren. 🎜🎜Hier ist nur eine Idee als Referenz, ich werde sie nicht umsetzen (weil wir einen besseren Weg haben xD). 🎜🎜Alternative: Multimethod-Bibliothek🎜🎜Diese Bibliothek gehört nicht zu den Standardbibliotheken und muss über pip installiert werden: 🎜rrreee🎜Vorteile🎜🎜multimethod verwendet einen Multi-Dispatch-Algorithmus, der besser erfüllen kann komplexere Anforderungsszene. Darüber hinaus bietet die Bibliothek eine gute Unterstützung für Typen in typing. 🎜🎜Bessere Vorgehensweise🎜🎜Zurück zur obigen Frage, wir können sie folgendermaßen verbessern:🎜
      • 🎜Verwenden Sie die multimethod-Methode anstelle von singledispatchmethod; 🎜🎜
      • 🎜Verwenden Sie Tuple[int, int, int], um tuple zu ersetzen. Die Länge und die Länge von Tupeln müssen nicht mehr manuell überprüft werden Elementtyp von): 🎜rrreee🎜Was wird der obige Code ausgeben? Oder wird es einen Fehler auslösen? 🎜🎜Ausgabe 2. 🎜🎜Wenn in Python Methoden mit demselben Namen definiert sind, überschreibt die letzte Methode die vorherige Methode. 🎜🎜Aber Sie wissen vielleicht nicht, dass wir dieses Verhalten durch die Metaklasse ändern können: 🎜rrreee🎜In den Zeilen 7 und 8 benennen wir die gleichnamige Methode a in b um und ruft es erfolgreich in Zeile 22 auf. 🎜🎜Die Betreuer von multimethod haben dies sinnvoll genutzt und Methoden mit doppelten Namen verarbeitet, um einen „Spezialeffekt“ zu erzielen. 🎜🎜Zurück zum Thema, wir können folgende Verbesserungen vornehmen: 🎜
        • 🎜Setzen Sie multimethod.multidata auf CustomDate Metaklasse der Klasse; 🎜🎜
        • 🎜Name aller Methoden __init__. 🎜🎜🎜rrreee🎜In Bezug auf die Wirkung ist dies genau das Gleiche wie das Überladen statischer Sprachmethoden! 🎜

      Das obige ist der detaillierte Inhalt vonSo definieren Sie die Überladung mehrerer Konstruktormethoden und generische Methoden in Python-Klassen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    Repo: Wie man Teamkollegen wiederbelebt
    4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    So programmieren Sie Deepseek So programmieren Sie Deepseek Feb 19, 2025 pm 05:36 PM

    Deepseek ist keine Programmiersprache, sondern ein tiefes Suchkonzept. Die Implementierung von Deepseek erfordert eine Auswahl auf der Grundlage vorhandener Sprachen. Für verschiedene Anwendungsszenarien ist es erforderlich, die entsprechende Sprache und Algorithmen auszuwählen und maschinelles Lernen zu kombinieren. Codequalität, Wartbarkeit und Tests sind von entscheidender Bedeutung. Nur durch die Auswahl der richtigen Programmiersprache können Algorithmen und Tools entsprechend Ihren Anforderungen und das Schreiben von Code von hochwertigem Code erfolgreich implementiert werden.

    Sozugreifen Sie auf Deepseekapi - Deepseekapi Access Tutorial Tutorial Sozugreifen Sie auf Deepseekapi - Deepseekapi Access Tutorial Tutorial Mar 12, 2025 pm 12:24 PM

    Detaillierte Erläuterung von Deepseekapi -Zugriff und -anruf: Quick Start Guide In diesem Artikel können Sie ausführlich auf Deepseekapi zugreifen und anrufen und Ihnen helfen, leistungsstarke KI -Modelle problemlos zu verwenden. Schritt 1: Holen Sie sich den API -Schlüssel, um auf die offizielle Website von Deepseek zuzugreifen, und klicken Sie in der oberen rechten Ecke auf die "Plattform". Sie erhalten eine bestimmte Anzahl freier Token (zur Messung der API -Verwendung verwendet). Klicken Sie im Menü links auf "Apikeys" und dann auf "Apikey erstellen". Nennen Sie Ihren Apikey (z. B. "Test") und kopieren Sie den generierten Schlüssel sofort. Stellen Sie sicher, dass Sie diesen Schlüssel richtig speichern, da er nur einmal angezeigt wird

    Großes Update von Pi Coin: Die PI Bank kommt! Großes Update von Pi Coin: Die PI Bank kommt! Mar 03, 2025 pm 06:18 PM

    Pinetwork startet Pibank, eine revolutionäre Mobile -Banking -Plattform! PiNetwork today released a major update on Elmahrosa (Face) PIMISRBank, referred to as PiBank, which perfectly integrates traditional banking services with PiNetwork cryptocurrency functions to realize the atomic exchange of fiat currencies and cryptocurrencies (supports the swap between fiat currencies such as the US dollar, euro, and Indonesian rupiah with cryptocurrencies such as PiCoin, USDT, and USDC). Was ist der Charme von Pibank? Lass uns herausfinden! Die Hauptfunktionen von Pibank: One-Stop-Management von Bankkonten und Kryptowährungsvermögen. Unterstützen Sie Echtzeittransaktionen und übernehmen Sie Biospezies

    Quantitative Währungssoftware Quantitative Währungssoftware Mar 19, 2025 pm 04:06 PM

    In diesem Artikel werden die quantitativen Handelsfunktionen der drei Hauptbörsen Binance, OKX und Gate.io untersucht, um quantitative Händler zu helfen, die richtige Plattform auszuwählen. Der Artikel stellt zunächst die Konzepte, Vorteile und Herausforderungen des quantitativen Handels ein und erklärt die Funktionen, dass eine hervorragende quantitative Handelssoftware wie API -Unterstützung, Datenquellen, Backtesting -Tools und Risikokontrollfunktionen haben sollte. Anschließend wurden die quantitativen Handelsfunktionen der drei Börsen ausführlich verglichen und analysiert, wobei sie auf ihre Vor- und Nachteile hingewiesen und schließlich Plattformauswahlvorschläge für quantitative Händler unterschiedlicher Erfahrungsstufen und Betonung der Bedeutung der Risikobewertung und des strategischen Backtests. Unabhängig davon

    Deepseek So bereitstellen Sie lokales R1 -Modell - Deepseek lokal ein R1 -Modell -Tutorial installieren Deepseek So bereitstellen Sie lokales R1 -Modell - Deepseek lokal ein R1 -Modell -Tutorial installieren Mar 12, 2025 pm 12:15 PM

    Lokaler Bereitstellungshandbuch für Deepseekl1 -Modell: Entsperren von Datenanalysen und Vorhersagepotential Deepseek ist ein leistungsstarkes Datenanalyse- und Vorhersage -Tool, und sein R1 -Modell kann eine effiziente und genaue Modellunterstützung für verschiedene Anwendungsszenarien bieten. Mit diesem Leitfaden wird Ihnen detaillierte Anweisungen zur Bereitstellung des DeepseEKR1-Modells in Ihrer lokalen Umgebung bereitgestellt, damit Sie schnell loslegen und seine Leistung nutzen können. Systemanforderungen für die lokale Bereitstellungsschrittvorbereitungsstufe des Deepr1 -Modells: Stellen Sie sicher, dass Ihre lokale Maschine die Mindestanforderungen für Systemkonfiguration von Deepseek erfüllt (für bestimmte Anforderungen finden Sie im offiziellen Deepseek -Dokument). Software -Installation: Laden Sie das von Deepseek bereitgestellte Installationspaket herunter und installieren Sie die Installationshandbuch

    So implementieren Sie Anrufe mit Python - Deepseek Python Call Method Guide So implementieren Sie Anrufe mit Python - Deepseek Python Call Method Guide Mar 12, 2025 pm 12:51 PM

    Deepseek Deep Learning Library Python Call Guide Deepseek ist eine leistungsstarke Deep -Learning -Bibliothek, mit der verschiedene neuronale Netzwerkmodelle erstellt und trainiert werden können. In diesem Artikel wird ausführlich vorgestellt, wie man Python verwendet, um Deepseek für Deep Learning Development anzurufen. Schritte, um Deepseek mit Python anzurufen. 1. Installieren Sie Deepseek stellen Sie sicher, dass die Python -Umgebung und die PIP -Tools installiert sind. Installieren Sie Deepseek mit dem folgenden Befehl: Pipinstalldeepseek2.

    Was ist Binance Alpha Was ist Binance Alpha Mar 25, 2025 pm 03:39 PM

    Anbi Alpha ist eine Tool- und Serviceaggregationsplattform für professionelle Händler und Investoren auf der Binance -Plattform. Zu den Kernfunktionen gehören: 1. Strategy Square, das verschiedene Handelsstrategien zusammenbringt; 2. Strategy Builder, der benutzerdefinierte Handelsstrategien ermöglicht; 3.. Erweiterte Datenanalyse, Bereitstellung von Marktanalysetools; 4. Dienste auf institutioneller Ebene, um den Bedürfnissen professioneller Investoren zu erfüllen.

    Welche Börsen können Optionsabsicherungsanweisungen über die Handelsseite senden Welche Börsen können Optionsabsicherungsanweisungen über die Handelsseite senden Mar 28, 2025 pm 03:27 PM

    Ab 2024 stützt der Mainstream-Kryptowährungsbörsen, die die direkte Sendung der Optionsabsicherungsanweisungen durch Handelsanschlüsse unterstützen: 1. Deribit unterstützt fortgeschrittene Strategien wie Delta-Absicherung und Gamma-Skalpaie und liefert Webversion/API One-Click-Absicherung. 2. OKX unterstützt Volatilitätsabsicherungs- und Strategie-Kombinationstools sowie ein integriertes Absicherungspanel im Web/der App. 3.. Binance unterstützt die Schutzabsicherung, die manuelle oder API -Kombinationspositionen erfordern. V. 5. Ledgerx, das Absicherungsinstrumente auf professioneller Ebene bietet und eine institutionelle Zertifizierung erfordert.

    See all articles