Apakah mungkin untuk memiliki metode statis di Python yang dapat saya panggil tanpa menginisialisasi kelas, seperti:
ClassName.static_method()
sumber
Apakah mungkin untuk memiliki metode statis di Python yang dapat saya panggil tanpa menginisialisasi kelas, seperti:
ClassName.static_method()
Yap, menggunakan dekorator metode statis
class MyClass(object):
@staticmethod
def the_static_method(x):
print(x)
MyClass.the_static_method(2) # outputs 2
Perhatikan bahwa beberapa kode mungkin menggunakan metode lama mendefinisikan metode statis, menggunakan staticmethod
sebagai fungsi daripada dekorator. Ini hanya boleh digunakan jika Anda harus mendukung versi Python kuno (2.2 dan 2.3)
class MyClass(object):
def the_static_method(x):
print(x)
the_static_method = staticmethod(the_static_method)
MyClass.the_static_method(2) # outputs 2
Ini sepenuhnya identik dengan contoh pertama (menggunakan @staticmethod
), hanya saja tidak menggunakan sintaksis dekorator yang bagus
Akhirnya, gunakan staticmethod()
hemat! Ada beberapa situasi di mana metode statis diperlukan dalam Python, dan saya telah melihat mereka menggunakan berkali-kali di mana fungsi "tingkat atas" yang terpisah akan lebih jelas.
Berikut ini kata demi kata dari dokumentasi :
Metode statis tidak menerima argumen pertama implisit. Untuk mendeklarasikan metode statis, gunakan idiom ini:
class C: @staticmethod def f(arg1, arg2, ...): ...
Bentuk @staticmethod adalah dekorator fungsi - lihat deskripsi definisi fungsi di definisi Fungsi untuk detail.
Itu dapat dipanggil baik di kelas (seperti
C.f()
) atau pada instance (sepertiC().f()
). Instance diabaikan kecuali untuk kelasnya.Metode statis dengan Python mirip dengan yang ditemukan di Java atau C ++. Untuk konsep yang lebih maju, lihat
classmethod()
.Untuk informasi lebih lanjut tentang metode statis, lihat dokumentasi tentang hierarki jenis standar di Hirarki tipe standar .
Baru di versi 2.2.
Diubah dalam versi 2.4: Sintaks dekorator fungsi ditambahkan.
@staticmethod
dekorasi atau menggunakan pointer fungsi, ketika Anda dapat dengan mudah menghindariself
parameter pertama ? Nah, untuk suatu objeka
, Anda tidak akan bisa menelepona.your_static_method()
, yang diizinkan dalam bahasa lain, tetapi itu tetap dianggap praktik yang buruk dan kompilator selalu memperingatkannyaClassName.methodName()
, seolah-olah itu adalah yang statis, dan kemudian tidakself
akan diberikan ke metode tersebut. Seperti yang Anda katakan, masih mungkin memanggil metode ini jugaClassInstance.methodName()
, danself
akan diberikan sebagai parameter pertama, apa pun namanya.Saya pikir Steven sebenarnya benar . Untuk menjawab pertanyaan awal, maka, untuk mengatur metode kelas, cukup berasumsi bahwa argumen pertama tidak akan menjadi contoh panggilan, dan kemudian pastikan bahwa Anda hanya memanggil metode dari kelas.
(Perhatikan bahwa jawaban ini merujuk ke Python 3.x. Dalam Python 2.x Anda akan mendapatkan
TypeError
untuk memanggil metode pada kelas itu sendiri.)Sebagai contoh:
Dalam kode ini, metode "rollCall" mengasumsikan bahwa argumen pertama bukanlah turunan (seperti jika dipanggil oleh turunan alih-alih kelas). Selama "rollCall" dipanggil dari kelas alih-alih sebuah instance, kode akan berfungsi dengan baik. Jika kami mencoba memanggil "rollCall" dari sebuah instance, misalnya:
Namun, itu akan menyebabkan pengecualian untuk dimunculkan karena akan mengirim dua argumen: itu sendiri dan -1, dan "rollCall" hanya didefinisikan untuk menerima satu argumen.
Secara kebetulan, rex.rollCall () akan mengirimkan jumlah argumen yang benar, tetapi juga akan menyebabkan pengecualian yang muncul karena sekarang n akan mewakili turunan Dog (yaitu, rex) ketika fungsi mengharapkan n menjadi numerik.
Di sinilah dekorasi datang: Jika kita mendahului metode "rollCall" dengan
kemudian, dengan secara eksplisit menyatakan bahwa metode ini statis, kita bahkan dapat menyebutnya dari sebuah instance. Sekarang,
akan bekerja. Penyisipan @staticmethod sebelum definisi metode, kemudian, menghentikan instance mengirimkan dirinya sebagai argumen.
Anda dapat memverifikasi ini dengan mencoba kode berikut dengan dan tanpa garis @staticmethod dikomentari.
sumber
TypeError: unbound method rollCall() must be called with Dog instance as first argument (got int instance instead)
T.my_static_method()
atautype(my_t_instance).my_static_method()
, karena ini lebih jelas dan membuatnya segera jelas bahwa saya memanggil metode statis.Ya, lihat dekorator metode statis :
sumber
Anda tidak benar - benar perlu menggunakan
@staticmethod
dekorator. Hanya mendeklarasikan metode (yang tidak mengharapkan parameter mandiri) dan memanggilnya dari kelas. Dekorator hanya ada jika Anda ingin dapat memanggilnya dari sebuah instance juga (yang bukan itu yang ingin Anda lakukan)Sebagian besar, Anda hanya menggunakan fungsi ...
sumber
class Dummy: def static1(): print "hello from static1" @staticmethod def static2(): print "hello from static2" Dummy.static2() Dummy.static1()
Output: halo dari static2 Traceback <panggilan terakhir terakhir>: File "ll.py", baris 46, dalam <module> Dummy.static1 () TypeError: unbound method static1 () harus dipanggil dengan contoh Dummy sebagai argumen pertama (tidak mendapatkan apa-apa)self
dianggap sebagai argumen pertama kecuali Anda mengatakannya untuk tidak melakukannya. (lihat: dekorator)self
referensi secara tepat tergantung pada bagaimana namanya. Test case: pastebin.com/12DDV7DB .staticmethod
dekorator memungkinkan seseorang untuk memanggil fungsi pada kedua kelas dan sebuah contoh (solusi ini gagal saat memanggil fungsi pada contoh).class C: def callme(): print('called'); C.callme()
Ya, metode statis dapat dibuat seperti ini (walaupun sedikit lebih Pythonic untuk menggunakan garis bawah daripada CamelCase untuk metode):
Di atas menggunakan sintaksis dekorator. Sintaks ini setara dengan
Ini dapat digunakan seperti yang Anda gambarkan:
Contoh bawaan dari metode statis adalah
str.maketrans()
di Python 3, yang merupakan fungsi dalamstring
modul di Python 2.Pilihan lain yang dapat digunakan seperti yang Anda gambarkan adalah
classmethod
, perbedaannya adalah bahwa metode class mendapatkan kelas sebagai argumen pertama implisit, dan jika subclass, maka ia mendapatkan subclass sebagai argumen pertama implisit.Perhatikan bahwa
cls
ini bukan nama yang diperlukan untuk argumen pertama, tetapi coders Python paling berpengalaman akan menganggapnya buruk jika Anda menggunakan hal lain.Ini biasanya digunakan sebagai konstruktor alternatif.
Contoh bawaan adalah
dict.fromkeys()
:sumber
Selain kekhasan bagaimana objek metode statis berperilaku, ada jenis kecantikan tertentu yang bisa Anda singgung ketika mengatur kode level modul Anda.
...
...
...
Sekarang menjadi sedikit lebih intuitif dan mendokumentasikan diri sendiri di mana konteks komponen tertentu dimaksudkan untuk digunakan dan ideal untuk penamaan kasus uji yang berbeda serta memiliki pendekatan langsung tentang bagaimana modul tes memetakan ke modul yang sebenarnya di bawah tes untuk puritan .
Saya sering merasa layak untuk menerapkan pendekatan ini untuk mengatur kode utilitas proyek. Cukup sering, orang langsung terburu-buru dan membuat
utils
paket dan berakhir dengan 9 modul yang satu memiliki 120 LOC dan sisanya adalah dua lusin LOC terbaik. Saya lebih suka memulai dengan ini dan mengubahnya menjadi sebuah paket dan membuat modul hanya untuk binatang buas yang benar-benar layak mendapatkannya:sumber
Mungkin opsi paling sederhana adalah dengan menempatkan fungsi-fungsi itu di luar kelas:
Dengan menggunakan metode ini, fungsi-fungsi yang memodifikasi atau menggunakan keadaan objek internal (memiliki efek samping) dapat disimpan di kelas, dan fungsi utilitas yang dapat digunakan kembali dapat dipindahkan ke luar.
Katakanlah file ini dipanggil
dogs.py
. Untuk menggunakan ini, Anda akan menelepondogs.barking_sound()
bukandogs.Dog.barking_sound
.Jika Anda benar-benar membutuhkan metode statis untuk menjadi bagian dari kelas, Anda dapat menggunakan staticmethod dekorator.
sumber
Jadi, metode statis adalah metode yang dapat dipanggil tanpa membuat objek kelas. Sebagai contoh :-
Dalam contoh metode di atas
add
dipanggil dengan nama kelasA
bukan nama objek.sumber
Metode Python Static dapat dibuat dengan dua cara.
Menggunakan staticmethod ()
Keluaran:
Hasil: 25
Menggunakan @staticmethod
Keluaran:
Hasil: 25
sumber
Saya menemukan pertanyaan ini dari waktu ke waktu. Kasus penggunaan dan contoh yang saya sukai adalah:
Tidak masuk akal untuk membuat objek kelas cmath, karena tidak ada keadaan dalam objek cmath. Namun, cmath adalah kumpulan metode yang semuanya terkait dalam beberapa cara. Dalam contoh saya di atas, semua fungsi dalam cmath bekerja pada bilangan kompleks dengan beberapa cara.
sumber