Saat mengintegrasikan aplikasi Django yang belum pernah saya gunakan sebelumnya, saya menemukan dua cara berbeda yang digunakan untuk mendefinisikan fungsi di kelas. Penulis sepertinya menggunakan keduanya dengan sangat sengaja. Yang pertama adalah yang sering saya gunakan:
class Dummy(object):
def some_function(self,*args,**kwargs):
do something here
self is the class instance
Yang lainnya adalah yang tidak saya gunakan, terutama karena saya tidak mengerti kapan harus menggunakannya, dan untuk apa:
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
do something here
cls refers to what?
Dalam dokumen Python, classmethod
dekorator dijelaskan dengan kalimat ini:
Metode kelas menerima kelas sebagai argumen pertama implisit, seperti metode instance menerima instance.
Jadi saya kira cls
mengacu pada Dummy
dirinya sendiri (itu class
, bukan contoh). Saya tidak begitu mengerti mengapa ini ada, karena saya selalu bisa melakukan ini:
type(self).do_something_with_the_class
Apakah ini hanya demi kejelasan, atau apakah saya melewatkan bagian terpenting: hal-hal menyeramkan dan menarik yang tidak dapat dilakukan tanpanya?
self.foo()
yang seharusnyaBar.foo()
.self.foo()
lebih disukai, karenaself
mungkin merupakan turunan dari subkelas yang mengimplementasikan miliknya sendirifoo
.Bar
, sebagai1+1 == 2 == 1*2
, jadi tidak mungkin untuk membedakan dari hasil yang ditampilkan yangBar().static_method
sebenarnya dipanggil.Pada dasarnya, Anda harus menggunakan @classmethod saat Anda menyadari bahwa definisi metode tidak akan diubah atau diganti.
Tambahan: Secara teoritis, metode kelas lebih cepat daripada metode objek, karena tidak perlu instantiated dan membutuhkan lebih sedikit memori.
sumber
Jika Anda menambahkan dekorator @classmethod, itu berarti Anda akan menjadikan metode itu sebagai metode statis java atau C ++. (metode statis adalah istilah umum yang saya kira ;) ) Python juga memiliki @staticmethod. dan perbedaan antara classmethod dan staticmethod adalah apakah Anda dapat mengakses kelas atau variabel statis menggunakan argumen atau nama kelas itu sendiri.
class TestMethod(object): cls_var = 1 @classmethod def class_method(cls): cls.cls_var += 1 print cls.cls_var @staticmethod def static_method(): TestMethod.cls_var += 1 print TestMethod.cls_var #call each method from class itself. TestMethod.class_method() TestMethod.static_method() #construct instances testMethodInst1 = TestMethod() testMethodInst2 = TestMethod() #call each method from instances testMethodInst1.class_method() testMethodInst2.static_method()
semua kelas tersebut meningkatkan cls.cls_var sebesar 1 dan mencetaknya.
Dan setiap kelas yang menggunakan nama yang sama pada lingkup yang sama atau contoh yang dibangun dengan kelas ini akan berbagi metode tersebut. Hanya ada satu TestMethod.cls_var dan juga hanya ada satu TestMethod.class_method (), TestMethod.static_method ()
Dan pertanyaan penting. mengapa metode ini dibutuhkan.
classmethod atau staticmethod berguna saat Anda menjadikan kelas tersebut sebagai pabrik atau saat Anda harus menginisialisasi kelas hanya sekali. seperti membuka file sekali, dan menggunakan metode umpan untuk membaca file baris demi baris.
sumber