Apa yang baru saja mengenai saya, yang berasal dari Ruby, adalah bahwa apa yang disebut metode kelas dan apa yang disebut metode instan hanyalah sebuah fungsi dengan makna semantik yang diterapkan pada parameter pertamanya, yang diam-diam diteruskan ketika fungsi tersebut disebut sebagai metode sebuah objek (misobj.meth()
).
Biasanya objek itu harus berupa instance tetapi @classmethod
dekorator metode mengubah aturan untuk lulus kelas. Anda dapat memanggil metode kelas dengan instance (hanya fungsi) - argumen pertama adalah kelasnya.
Karena itu hanya fungsi , itu hanya dapat dideklarasikan sekali dalam ruang lingkup yang diberikan (yaitu class
definisi). Karena itu, jika mengikuti, sebagai kejutan bagi seorang Rubyist, bahwa Anda tidak dapat memiliki metode kelas dan metode contoh dengan nama yang sama .
Pertimbangkan ini:
class Foo():
def foo(x):
print(x)
Anda dapat memanggil foo
sebuah instance
Foo().foo()
<__main__.Foo instance at 0x7f4dd3e3bc20>
Tapi tidak di kelas:
Foo.foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with Foo instance as first argument (got nothing instead)
Sekarang tambahkan @classmethod
:
class Foo():
@classmethod
def foo(x):
print(x)
Memanggil instance sekarang melewati kelasnya:
Foo().foo()
__main__.Foo
seperti halnya memanggil kelas:
Foo.foo()
__main__.Foo
Hanya konvensi yang menentukan yang kami gunakan self
untuk argumen pertama tentang metode instance dan cls
metode kelas. Saya tidak menggunakan di sini untuk menggambarkan bahwa itu hanya argumen. Di Ruby, self
adalah kata kunci.
Kontras dengan Ruby:
class Foo
def foo()
puts "instance method #{self}"
end
def self.foo()
puts "class method #{self}"
end
end
Foo.foo()
class method Foo
Foo.new.foo()
instance method #<Foo:0x000000020fe018>
Metode kelas Python hanyalah fungsi yang didekorasi dan Anda dapat menggunakan teknik yang sama untuk membuat dekorator Anda sendiri . Metode yang dihiasi membungkus metode nyata (dalam kasus @classmethod
itu melewati argumen kelas tambahan). Metode yang mendasarinya masih ada, tersembunyi tetapi masih dapat diakses .
catatan kaki: Saya menulis ini setelah bentrokan nama antara kelas dan metode contoh membuat saya penasaran. Saya jauh dari ahli Python dan ingin komentar jika semua ini salah.