Apa itu "metode kelas" dan "metode instan", dalam Python?
"Metode instance" menggunakan informasi yang terdapat dalam instance untuk mengetahui nilai apa yang akan dikembalikan (atau efek samping mana yang harus dilakukan). Ini sangat umum.
"Metode kelas" menggunakan informasi tentang kelas (dan bukan turunan dari kelas itu) untuk memengaruhi apa yang dilakukannya (mereka biasanya digunakan untuk membuat instance baru sebagai konstruktor alternatif, dan karenanya tidak terlalu umum).
"Metode statis" tidak menggunakan informasi apa pun tentang kelas atau instance untuk menghitung apa yang dilakukannya. Biasanya hanya di kelas untuk kenyamanan. (Karena itu, ini juga tidak umum.)
Fungsi X
Ingat kelas matematika, "kamu adalah fungsi dari x f(x)
,?" Mari kita terapkan itu dalam kode:
y = function(x)
Tersirat di atas adalah bahwa karena x
dapat berubah, y
dapat berubah ketika x
perubahan. Inilah yang dimaksud ketika kita mengatakan bahwa " y
adalah fungsi dari x
"
Apa yang akan y
terjadi bila z
adalah 1
? 2
? 'FooBarBaz'
?
y
bukan fungsi z
, jadi z
bisa apa saja dan tidak memengaruhi hasil fungsi dengan anggapan kita function
adalah fungsi murni. (Jika diakses z
sebagai variabel global, maka itu bukan fungsi murni - inilah yang dimaksud dengan kemurnian fungsional.)
Ingatlah hal-hal di atas ketika Anda membaca deskripsi berikut:
Metode Instance
Metode instance adalah fungsi yang merupakan fungsi dari instance . Fungsi menerima instance secara implisit sebagai argumen padanya, dan instance digunakan oleh fungsi untuk menentukan output dari fungsi.
Contoh bawaan dari metode instance adalah str.lower:
>>> 'ABC'.lower()
'abc'
str.lower
dipanggil pada instance string, dan menggunakan informasi yang terkandung dalam instance untuk mencari string baru yang akan dikembalikan.
Metode Kelas:
Ingat, dengan Python, semuanya adalah objek. Itu berarti kelas adalah objek, dan dapat dilewatkan sebagai argumen ke suatu fungsi.
Metode kelas adalah fungsi yang merupakan fungsi dari kelas . Itu menerima kelas sebagai argumen untuk itu.
Contoh bawaan adalah dict.fromkeys
:
>>> dict.fromkeys('ABC')
{'C': None, 'B': None, 'A': None}
Fungsi tersebut secara implisit mengetahui kelasnya sendiri, fungsinya menggunakan kelas tersebut untuk memengaruhi output fungsi, dan ia membuat yang baru dari kelas tersebut dari yang dapat diubah. Sebuah OrderedDict menunjukkan ini saat menggunakan metode yang sama:
>>> from collections import OrderedDict
>>> OrderedDict.fromkeys('ABC')
OrderedDict([('A', None), ('B', None), ('C', None)])
Metode kelas menggunakan informasi tentang kelas (dan bukan turunan dari kelas itu) untuk memengaruhi tipe kelas yang akan dikembalikan.
Metode Statis
Anda menyebutkan metode yang "tidak tahu kelasnya" - ini adalah metode statis dengan Python. Itu hanya dilampirkan untuk kenyamanan ke objek kelas. Secara opsional bisa menjadi fungsi terpisah di modul lain, tetapi tanda tangan panggilannya akan sama.
Metode statis adalah fungsi baik dari kelas maupun objek.
Contoh built-in dari metode statis adalah str.maketrans dari Python 3.
>>> str.maketrans('abc', 'bca')
{97: 98, 98: 99, 99: 97}
Diberikan beberapa argumen, itu membuat kamus yang bukan fungsi dari kelasnya.
Ini nyaman karena str
selalu tersedia di namespace global, sehingga Anda dapat dengan mudah menggunakannya dengan fungsi terjemahan:
>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
'bcrbabdbcrb'
Dalam Python 2, Anda harus mengaksesnya dari string
modul:
>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'str' has no attribute 'maketrans'
>>> import string
>>> 'abracadabra'.translate(string.maketrans('abc', 'bca'))
'bcrbabdbcrb'
Contoh
class AClass(object):
"""In Python, a class may have several types of methods:
instance methods, class methods, and static methods
"""
def an_instance_method(self, x, y, z=None):
"""this is a function of the instance of the object
self is the object's instance
"""
return self.a_class_method(x, y)
@classmethod
def a_class_method(cls, x, y, z=None):
"""this is a function of the class of the object
cls is the object's class
"""
return cls.a_static_method(x, y, z=z)
@staticmethod
def a_static_method(x, y, z=None):
"""this is neither a function of the instance or class to
which it is attached
"""
return x, y, z
Mari instantiate:
>>> instance = AClass()
Sekarang instance dapat memanggil semua metode:
>>> instance.an_instance_method('x', 'y')
('x', 'y', None)
>>> instance.a_static_method('x', 'y')
('x', 'y', None)
>>> instance.a_class_method('x', 'y')
('x', 'y', None)
Tetapi kelas biasanya tidak dimaksudkan untuk memanggil metode instance, meskipun diharapkan memanggil yang lain:
>>> AClass.a_class_method('x', 'y')
('x', 'y', None)
>>> AClass.a_static_method('x', 'y')
('x', 'y', None)
>>> AClass.an_instance_method('x', 'y')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: an_instance_method() missing 1 required positional argument: 'y'
Anda harus secara eksplisit memberikan instance untuk memanggil metode instance:
>>> AClass.an_instance_method(instance, 'x', 'y')
('x', 'y', None)