cari
Rumahpembangunan bahagian belakangTutorial PythonBagaimana untuk mentakrifkan kaedah lebihan kaedah pembina dan kaedah generik dalam kelas Python

    Apakah itu "kaedah generik"?

    Kaedah yang terdiri daripada berbilang kaedah yang melaksanakan operasi yang sama untuk jenis yang berbeza.

    Sebagai contoh

    Kini terdapat keperluan yang memerlukan anda membuat kelas tarikh tersuai (CustomDate) dengan cara berikut:

    • Cap masa

    • Tahun, bulan, hari (tuple mengandungi tiga integer)

    • rentetan format ISO

    • Datetime Kelas

    Pelaksanaan am

    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

    Nota: Kami tidak akan membincangkan sama ada cop tarikh/masa yang masuk adalah sah atau tidak , hanya membuat pertimbangan kasar pada jenis.

    Adakah cara yang lebih baik?

    Kami boleh membahagikan kaedah pembinaan yang berbeza kepada berbilang kaedah dan menggunakan functools penghias dalam singledispatchmethod untuk memutuskan kaedah yang hendak dipanggil berdasarkan jenis parameter yang dihantar.

    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

    Dengan cara ini, kita boleh mengasingkan pemulaan setiap jenis parameter kepada kaedah yang berasingan.

    Kelemahan

    #1 Penghantaran tunggal

    Pelaksanaan kaedah yang manakah harus digunakan semasa panggilan ditentukan oleh algoritma penghantaran. Jika algoritma memutuskan pelaksanaan kaedah untuk digunakan hanya berdasarkan jenis parameter tunggal, ia dipanggil penghantaran tunggal.

    singledispatchmethod Ia adalah satu penghantaran. Iaitu, hanya parameter pertama akan dipertimbangkan. Ini adalah jauh dari cukup dalam perniagaan sebenar.

    #2 tidak menyokong penaipan

    Walau bagaimanapun, seperti di atas, kita masih perlu menggunakan if/else untuk menentukan jenis elemen dalam tuple. Iaitu, kita tidak boleh menggunakan typing.Tuple[int, int, int].

    Sebagai kompromi, mungkin kita boleh mentakrifkan kelas ThreeIntTuple untuk melayakkannya dan mengasingkan pertimbangan ini daripada kelas CustomDate.

    Ini hanya idea untuk rujukan anda, saya tidak akan melaksanakannya (kerana kita ada cara yang lebih baik xD).

    Alternatif: perpustakaan pelbagai kaedah

    Pustaka ini bukan salah satu perpustakaan standard dan perlu dipasang melalui pip:

    pip install multimethod

    Kelebihan

    multimethod Algoritma Berbilang penghantaran yang digunakan boleh memenuhi senario yang lebih kompleks dengan lebih baik. Selain itu, perpustakaan mempunyai sokongan yang baik untuk jenis dalam typing.

    Amalan yang lebih baik

    Berbalik kepada soalan di atas, kita boleh memperbaikinya seperti ini:

    • Gunakan kaedah multimethod dan bukannya singledispatchmethod ;

    • Gunakan Tuple[int, int, int] bukannya tuple, tidak perlu lagi menyemak panjang dan jenis elemen tuple secara manual; >Kaedah praktikal muktamad (pembebanan kaedah sebenar)

    • Sebelum itu, izinkan saya bertanya soalan mudah kepada anda (ini berkait rapat dengan kandungan kami yang seterusnya):
    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

    Apakah yang akan dikeluarkan oleh kod di atas ? Atau adakah ia akan menimbulkan ralat?

    Output

    .

    Dalam Python, jika kaedah dengan nama yang sama ditakrifkan, kaedah terakhir akan menimpa kaedah sebelumnya.

    2Tetapi anda mungkin tidak tahu bahawa kami boleh mengubah tingkah laku ini melalui metaclass:

    class A:
        def a(self):
            print(1)
        def a(self):
            print(2)
    A().a()

    Dalam baris 7 dan 8, kami menamakan semula kaedah

    pendua untuk

    , dan berjaya memanggilnya pada baris 22. Penyelenggara

    a telah menggunakan ini dengan baik dan telah berurusan dengan nama pendua untuk mencapai "kesan khas". b

    Kembali kepada topik, kita boleh membuat penambahbaikan berikut:

    multimethod

    Tetapkan

    sebagai kelas meta bagi kelas
    • menamakan semua kaedah multimethod.multidata. CustomDate

    • 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
    • Dari segi kesan, ini betul-betul sama dengan kaedah bahasa statik terlebih muatan!

    Atas ialah kandungan terperinci Bagaimana untuk mentakrifkan kaedah lebihan kaedah pembina dan kaedah generik dalam kelas Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan
    Artikel ini dikembalikan pada:亿速云. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
    Menyenaraikan senarai di Python: Memilih kaedah yang betulMenyenaraikan senarai di Python: Memilih kaedah yang betulMay 14, 2025 am 12:11 AM

    Tomergelistsinpython, operator youCanusethe, extendmethod, listcomprehension, oritertools.chain, eachwithspecificadvantages: 1) operatorSimpleButlessefficientficorlargelists;

    Bagaimana untuk menggabungkan dua senarai dalam Python 3?Bagaimana untuk menggabungkan dua senarai dalam Python 3?May 14, 2025 am 12:09 AM

    Dalam Python 3, dua senarai boleh disambungkan melalui pelbagai kaedah: 1) Pengendali penggunaan, yang sesuai untuk senarai kecil, tetapi tidak cekap untuk senarai besar; 2) Gunakan kaedah Extend, yang sesuai untuk senarai besar, dengan kecekapan memori yang tinggi, tetapi akan mengubah suai senarai asal; 3) menggunakan * pengendali, yang sesuai untuk menggabungkan pelbagai senarai, tanpa mengubah suai senarai asal; 4) Gunakan itertools.chain, yang sesuai untuk set data yang besar, dengan kecekapan memori yang tinggi.

    Rentetan senarai concatenate pythonRentetan senarai concatenate pythonMay 14, 2025 am 12:08 AM

    Menggunakan kaedah Join () adalah cara yang paling berkesan untuk menyambungkan rentetan dari senarai di Python. 1) Gunakan kaedah Join () untuk menjadi cekap dan mudah dibaca. 2) Kitaran menggunakan pengendali tidak cekap untuk senarai besar. 3) Gabungan pemahaman senarai dan menyertai () sesuai untuk senario yang memerlukan penukaran. 4) Kaedah mengurangkan () sesuai untuk jenis pengurangan lain, tetapi tidak cekap untuk penyambungan rentetan. Kalimat lengkap berakhir.

    Pelaksanaan Python, apa itu?Pelaksanaan Python, apa itu?May 14, 2025 am 12:06 AM

    PythonexecutionistheprocessoftransformingpythoncodeIntoExecutableInstructions.1) TheinterpreterreadsTheCode, convertingIntoByteCode, yang mana -mana

    Python: Apakah ciri -ciri utamaPython: Apakah ciri -ciri utamaMay 14, 2025 am 12:02 AM

    Ciri -ciri utama Python termasuk: 1. Sintaks adalah ringkas dan mudah difahami, sesuai untuk pemula; 2. Sistem jenis dinamik, meningkatkan kelajuan pembangunan; 3. Perpustakaan standard yang kaya, menyokong pelbagai tugas; 4. Komuniti dan ekosistem yang kuat, memberikan sokongan yang luas; 5. Tafsiran, sesuai untuk skrip dan prototaip cepat; 6. Sokongan multi-paradigma, sesuai untuk pelbagai gaya pengaturcaraan.

    Python: pengkompil atau penterjemah?Python: pengkompil atau penterjemah?May 13, 2025 am 12:10 AM

    Python adalah bahasa yang ditafsirkan, tetapi ia juga termasuk proses penyusunan. 1) Kod python pertama kali disusun ke dalam bytecode. 2) Bytecode ditafsirkan dan dilaksanakan oleh mesin maya Python. 3) Mekanisme hibrid ini menjadikan python fleksibel dan cekap, tetapi tidak secepat bahasa yang disusun sepenuhnya.

    Python untuk gelung vs semasa gelung: Bila menggunakan yang mana?Python untuk gelung vs semasa gelung: Bila menggunakan yang mana?May 13, 2025 am 12:07 AM

    UseAforLoopWheniteratingOvereForforpecificNumbimes; Useaphileloopwhencontinuinguntilaconditionismet.forloopsareidealforknownownsequences, sementara yang tidak digunakan.

    Gelung Python: Kesalahan yang paling biasaGelung Python: Kesalahan yang paling biasaMay 13, 2025 am 12:07 AM

    Pythonloopscanleadtoerrorslikeinfiniteloops, pengubahsuaianListsduringiteration, off-by-oneerrors, sifar-indexingissues, andnestedloopinefficies.toavoidthese: 1) use'i

    See all articles

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    Video Face Swap

    Video Face Swap

    Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

    Artikel Panas

    Nordhold: Sistem Fusion, dijelaskan
    4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
    Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
    3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

    Alat panas

    Versi Mac WebStorm

    Versi Mac WebStorm

    Alat pembangunan JavaScript yang berguna

    mPDF

    mPDF

    mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

    MantisBT

    MantisBT

    Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

    SublimeText3 versi Cina

    SublimeText3 versi Cina

    Versi Cina, sangat mudah digunakan

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    Persekitaran pembangunan bersepadu PHP yang berkuasa