Saya mencoba menerapkan metode overloading di Python:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow(2)
tetapi hasilnya adalah second method 2
; demikian pula:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow()
memberi
Traceback (most recent call last):
File "my.py", line 9, in <module>
ob.stackoverflow()
TypeError: stackoverflow() takes exactly 2 arguments (1 given)
Bagaimana saya membuat ini bekerja?
python
class
overloading
pengguna1335578
sumber
sumber
Jawaban:
Metode overloading bukan metode overriding . Dan dengan Python, Anda melakukan semuanya dalam satu fungsi:
Anda tidak dapat memiliki dua metode dengan nama yang sama dengan Python - dan Anda tidak perlu melakukannya.
Lihat bagian Nilai Argumen Default dari tutorial Python. Lihat "Terkejut" dan Argumen Default Mutable untuk menghindari kesalahan umum.
Sunting : Lihat PEP 443 untuk informasi tentang fungsi generik pengiriman tunggal baru di Python 3.4.
sumber
Anda juga dapat menggunakan pythonlangutil :
sumber
Dengan Python, Anda tidak melakukan hal-hal seperti itu. Ketika orang melakukannya dalam bahasa seperti Java, mereka umumnya menginginkan nilai default (jika tidak, mereka umumnya menginginkan metode dengan nama yang berbeda). Jadi, dengan Python, Anda dapat memiliki nilai default .
Seperti yang Anda lihat, Anda dapat menggunakan ini untuk memicu perilaku terpisah daripada hanya memiliki nilai default.
sumber
None
berguna ketika Anda menginginkan nilai default yang bisa berubah. Perilaku terpisah harus dalam fungsi yang terpisah.None
juga dapat berguna sebagai nilai default asli.Anda tidak bisa, tidak pernah perlu dan tidak benar-benar ingin.
Dalam Python, semuanya adalah objek. Kelas adalah benda, jadi benda adalah benda. Begitu juga metode.
Ada objek yang disebut
A
yang merupakan kelas. Ini memiliki atribut yang disebutstackoverflow
. Itu hanya dapat memiliki satu atribut seperti itu.Saat Anda menulis
def stackoverflow(...): ...
, yang terjadi adalah Anda membuat objek yang merupakan metode, dan menetapkannya kestackoverflow
atributA
. Jika Anda menulis dua definisi, yang kedua menggantikan yang pertama, dengan cara yang sama yang selalu berlaku tugasAnda juga tidak ingin menulis kode yang lebih liar dari hal-hal yang kadang-kadang digunakan untuk overloading. Bukan itu cara kerjanya.
Alih-alih mencoba mendefinisikan fungsi terpisah untuk setiap jenis hal yang dapat Anda berikan (yang tidak masuk akal karena Anda tidak menentukan jenis untuk parameter fungsi), berhenti khawatir tentang hal - hal apa saja dan mulailah memikirkan apa yang dapat mereka lakukan .
Anda tidak hanya tidak dapat menulis yang terpisah untuk menangani tuple vs daftar, tetapi juga tidak mau atau perlu .
Yang Anda lakukan hanyalah mengambil keuntungan dari fakta bahwa keduanya, misalnya, dapat diubah (yaitu Anda dapat menulis
for element in container:
). (Fakta bahwa mereka tidak terkait langsung dengan warisan tidak relevan.)sumber
@overload
dekorator, saya akan mengatakan bahwa "tidak benar-benar ingin" bisa diperdebatkan, paling-paling. Dari PEP-3124, "... saat ini merupakan anti-pola umum untuk kode Python untuk memeriksa jenis argumen yang diterima ... 'cara yang jelas' untuk melakukan ini adalah dengan jenis inspeksi, tetapi ini rapuh dan tertutup untuk ekstensi ... "Jadi sepertinya cukup banyak orang yang menginginkannya, bahwa itu menjadi bagian dari Python.@overload
hanya untuk mengetik.Sementara @agf benar dengan jawaban di masa lalu sekarang dengan PEP-3124 kami mendapat gula sintaksis kami. Lihat mengetik dokumentasi untuk detail pada
@overload
dekorator tetapi perhatikan bahwa ini benar-benar hanya gula sintaks dan IMHO. Ini semua orang telah berdebat sejak itu. Secara pribadi saya setuju bahwa memiliki beberapa fungsi dengan tanda tangan yang berbeda membuatnya lebih mudah dibaca kemudian memiliki fungsi tunggal dengan 20 + argumen siap untuk nilai default (None
sebagian besar waktu) dan kemudian harus biola sekitar menggunakan habisnyaif
,elif
,else
rantai untuk mencari tahu apa penelepon sebenarnya ingin fungsi kita berhubungan dengan set argumen yang disediakan. Ini sudah lama tertunda mengikuti Python Zendan bisa dibilang juga
Langsung dari dokumentasi Python resmi yang ditautkan di atas:
sumber
@overload
fungsi ed seharusnya tidak memiliki implementasi aktual. Ini tidak jelas dari contoh dalam dokumentasi Python.Saya menulis jawaban saya dengan Python 3.2.1.
Bagaimana itu bekerja:
overload
mengambil jumlah callable dan menyimpannya dalam tuplefunctions
, lalu mengembalikan lambda.functions[number_of_unnamed_args_passed]
dipanggil dengan argumen yang diteruskan ke lambda.Pemakaian:
sumber
Saya pikir kata yang Anda cari adalah "kelebihan beban". Tidak ada metode overloading di python. Namun Anda dapat menggunakan argumen default, sebagai berikut.
Ketika Anda memberikan argumen, itu akan mengikuti logika kondisi pertama dan menjalankan pernyataan cetak pertama. Ketika Anda tidak memberikan argumen, itu akan masuk ke
else
kondisi dan menjalankan pernyataan cetak kedua.sumber
Saya menulis jawaban saya dengan Python 2.7:
Dengan Python, metode overload tidak dimungkinkan; jika Anda benar-benar ingin mengakses fungsi yang sama dengan fitur yang berbeda, saya sarankan Anda menggunakan metode override.
sumber
Dalam Python, overloading bukan konsep terapan. Namun, jika Anda mencoba membuat kasus di mana, misalnya, Anda ingin satu inisialisasi dijalankan jika melewati argumen tipe
foo
dan inisialisasi lain untuk argumen tipebar
kemudian, karena segala sesuatu di Python ditangani sebagai objek, Anda dapat memeriksa nama tipe kelas objek yang dilewati dan menulis penanganan bersyarat berdasarkan itu.Konsep ini dapat diterapkan ke beberapa skenario berbeda melalui metode yang berbeda sesuai kebutuhan.
sumber
Dengan Python, Anda akan melakukan ini dengan argumen default.
sumber
Baru saja menemukan https://github.com/bintoro/overloading.py ini bagi siapa saja yang mungkin tertarik.
Dari readme repositori terkait:
sumber
Python tidak mendukung metode overloading seperti Java atau C ++. Kami mungkin kelebihan metode, tetapi hanya dapat menggunakan metode yang ditetapkan terbaru.
Kami perlu memberikan argumen opsional atau * argumen untuk memberikan jumlah argumen yang berbeda pada panggilan.
Atas perkenan dari https://www.geeksforgeeks.org/python-method-overloading/
sumber
Python 3.x termasuk perpustakaan pengetikan standar yang memungkinkan untuk metode overloading dengan menggunakan dekorator overload @. Sayangnya, ini untuk membuat kode lebih mudah dibaca, karena metode yang dihiasi dengan @ kelebihan perlu diikuti oleh metode yang tidak dihiasi yang menangani argumen yang berbeda. Lebih banyak dapat ditemukan di sini di sini tetapi untuk contoh Anda:
sumber
Dalam file MathMethod.py
Dalam file Main.py
Kita dapat membebani metode dengan menggunakan multipledispatch
sumber
Python menambahkan dekorator @ overload dengan PEP-3124 untuk menyediakan gula sintaksis untuk overloading melalui inspeksi tipe - alih-alih hanya bekerja dengan menimpa.
Contoh kode tentang kelebihan muatan melalui @overload dari PEP-3124
ditransformasikan oleh @ overload-dekorator ke:
sumber