Metode statis - Bagaimana cara memanggil metode dari metode lain?


96

Ketika saya memiliki metode reguler untuk memanggil metode lain di kelas, saya harus melakukan ini

class test:
    def __init__(self):
        pass
    def dosomething(self):
        print "do something"
        self.dosomethingelse()
    def dosomethingelse(self):
        print "do something else"

tetapi ketika saya memiliki metode statis, saya tidak dapat menulis

self.dosomethingelse()

karena tidak ada contoh. Bagaimana yang harus saya lakukan dengan Python untuk memanggil metode statis dari metode statis lain dari kelas yang sama?

Sunting: berantakan sekali. Oke, saya edit kembali pertanyaannya ke pertanyaan awal. Saya sudah memiliki jawaban untuk pertanyaan kedua yang ada di komentar Peter Hansen. Jika Anda pikir saya harus membuka pertanyaan lain untuk jawaban yang sudah saya miliki, tolong beri tahu saya.


3
@pablo: Anda tidak dapat mengubah esensi pertanyaan !! Akhiri pertanyaan ini dan mulai pertanyaan lain !!
jldupont

ok ok. maksud Anda hapus pertanyaannya? Jawabannya sudah ada dalam komentar Peter Hansen
Pablo

@pablo: Anda tidak dapat menghapus di sini, itu tidak sopan untuk semua orang yang menyumbangkan jawaban atas pertanyaan Anda. Anda perlu menerima jawaban dan membuat pertanyaan baru.
jldupont

1
@pablo: dan hanya untuk memperjelas: jawaban harus diterima untuk rumusan pertanyaan asli Anda . Jangan khawatir, Anda akan belajar di sini. Cheers :-)
jldupont

Jawaban:


79

class.method harus bekerja.

class SomeClass:
  @classmethod
  def some_class_method(cls):
    pass

  @staticmethod
  def some_static_method():
    pass

SomeClass.some_class_method()
SomeClass.some_static_method()

17
Saran harus ditambahkan di sini: Jelas bahwa metode kelas tidak memiliki kekurangan dibandingkan metode statis, dan metode kelas memungkinkan metode tersebut diperpanjang di masa mendatang untuk memanggil metode kelas lainnya. Jadi itu harus selalu diutamakan, meski tidak ada kebutuhan mendesak.
u0b34a0f6ae

1
@ u0b34a0f6ae: Saya tidak tahu apakah saya melakukan sesuatu dengan baik atau tidak ... tapi saya mendefinisikan dekorator di dalam kelas. Dekorator haruslah "metode statis", bukan "metode kelas".
André Caldas

@ u0b34a0f6ae Apakah metode kelas selalu thread safe? Dalam kasus penggunaan saya, saya menggunakan metode statis di utas untuk mencegah akses tidak disengaja ke kelas yang mungkin tidak aman utas.
aquavitae

@ u0b34a0f6ae selalu sedikit kuat. Misalnya menggunakan metode statis PySpark dapat digunakan dalam tugas rdd dan metode kelas tidak bisa.
Laurens Koppenol

136

Bagaimana yang harus saya lakukan dengan Python untuk memanggil metode statis dari metode statis lain dari kelas yang sama?

class Test() :
    @staticmethod
    def static_method_to_call()
        pass

    @staticmethod
    def another_static_method() :
        Test.static_method_to_call()

    @classmethod
    def another_class_method(cls) :
        cls.static_method_to_call()

Panggilan Test.static_method_to_call()harus bekerja dari metode non-statis dan non-kelas lain dari kelas ini juga, bukan? (... dan mungkin kelas lain juga?)
gr4nt3d

Ya, Test.static_method_to_call()akan bekerja dari mana saja.
warvariuc

11

CATATAN - sepertinya pertanyaannya telah berubah beberapa. Jawaban atas pertanyaan tentang bagaimana Anda memanggil metode instance dari metode statis adalah Anda tidak bisa tanpa meneruskan instance sebagai argumen atau membuat instance itu di dalam metode statis.

Berikut ini sebagian besar untuk menjawab "bagaimana Anda memanggil metode statis dari metode statis lain":

Ingatlah bahwa ada adalah perbedaan antara metode statis dan metode kelas dengan Python. Metode statis tidak mengambil argumen pertama implisit, sedangkan metode kelas mengambil kelas sebagai argumen pertama implisit (biasanya clsberdasarkan konvensi). Dengan mengingat hal itu, inilah cara Anda melakukannya:

Jika itu metode statis:

test.dosomethingelse()

Jika itu metode kelas:

cls.dosomethingelse()

1
Anda hanya dapat menggunakan cls.dosomethingelse()dari dalam definisi kelas.
jldupont

3
Agar lebih akurat, Anda hanya dapat menggunakan cls.dosomethingelse()dari dalam metode kelas itu sendiri. Sama seperti Anda hanya dapat menggunakan selfdari dalam metode instance itu sendiri.
Jason Baker

1
maaf, saya salah menulis pertanyaan. OOPS !. Saya ingin menulis "Bagaimana yang harus saya lakukan dengan Python untuk memanggil metode instance dari metode statis lain dari kelas yang sama" dan bukan "Bagaimana yang harus saya lakukan dengan Python untuk memanggil metode statis dari metode statis lain yang sama? kelas "
Pablo

@pablo: Dalam hal ini, Anda perlu menulis pertanyaan lain dan menyelesaikan pertanyaan ini.
jldupont

@jldupont, saya sudah punya jawabannya tapi dalam satu komentar. Apa yang harus saya lakukan karena saya tidak dapat menerimanya tetapi akan sia-sia untuk menghapus pertanyaan, bukan?
Pablo

4

Oke, perbedaan utama antara metode kelas dan metode statis adalah:

  • metode kelas memiliki identitasnya sendiri, itulah mengapa mereka harus dipanggil dari dalam sebuah INSTANCE.
  • di sisi lain, metode statis dapat dibagikan di antara beberapa instance sehingga harus dipanggil dari dalam THE CLASS

0

Anda tidak dapat memanggil metode non-statis dari metode statis tetapi dengan membuat instance di dalam metode statis .... seharusnya berfungsi seperti itu

class test2(object):
    def __init__(self):
        pass

    @staticmethod
    def dosomething():
        print "do something"
        #creating an instance to be able to call dosomethingelse(),or you may use any existing instace
        a=test2()
        a.dosomethingelse()

    def dosomethingelse(self):
        print "do something else"

test2.dosomething()

berharap itu akan membantu Anda :)


3
IMO pendekatan ini terutama lebih buruk daripada hanya menggunakan @classmethoduntuk mendeklarasikan metode Anda, dan menggunakan cls.dosomethingelse()dalam cls.dosomething()- lebih buruk dalam hal kinerja (membuat instance objek hanya untuk mendapatkan akses ke metode statis) dan keterbacaan (tidak langsung, dan saya membayangkan jika semacam itu pola menjadi boilerplate, seluruh basis kode bisa menjadi sangat sulit bagi manusia untuk mengurai)
Kyle Wild

Seperti yang saya baca di tempat lain di SO, alih-alih menginisialisasi instance secara langsung untuk memanggil metode, Anda bisa memanggilnya - itu akan menginisialisasi dirinya sendiri.
Nakilon

0

Jika ini tidak bergantung pada kelas atau instance, mengapa tidak menjadikannya sebagai fungsi? Karena ini akan tampak seperti solusi yang jelas. Kecuali tentu saja Anda pikir itu akan perlu ditimpa, subkelas dll. Jika demikian maka jawaban sebelumnya adalah taruhan terbaik. Semoga saja saya tidak akan dihargai karena hanya menawarkan solusi alternatif yang mungkin atau mungkin tidak sesuai dengan kebutuhan seseorang;).

Karena jawaban yang benar akan tergantung pada kasus penggunaan kode tersebut;) Selamat menikmati

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.