Python'da “sınıf yöntemleri” ve “örnek yöntemleri” nedir?
Bir "örnek yöntemi", hangi değerin geri döndürüleceğini (veya hangi yan etkinin yapılacağını) bulmak için bu örnekte yer alan bilgileri kullanır. Bunlar çok yaygın.
Bir "sınıf metodu" sınıfla ilgili bilgileri (ve o sınıfın bir örneğini değil) ne yaptığını etkilemek için kullanır (genellikle alternatif kurucular olarak yeni örnekler oluşturmak için kullanılır ve bu nedenle inanılmaz derecede yaygın değildir).
Bir "statik yöntem", ne yaptığını hesaplamak için sınıf veya örnek hakkında herhangi bir bilgi kullanmaz. Genellikle kolaylık sağlamak için sadece sınıfta. (Bu nedenle, bunlar da pek yaygın değildir.)
X'in bir İşlevi
Matematik sınıfını hatırlayın, "y, x'in bir işlevidir f(x)
?" Bunu kodda uygulayalım:
y = function(x)
Yukarıdakilerin ima ettiği, x
değişebileceğinden beri değiştiğinde y
değişebileceğidir x
. Biz "demek, bu kastedilen budur y
bir fonksiyonudur x
"
Ne olacak y
ne olmak z
olduğunu 1
? 2
? 'FooBarBaz'
?
y
bir fonksiyonu değildir z
bu yüzden, z
her şey olabilir ve bizim varsayarak fonksiyonun sonucunu etkileyebilecek function
olan saf bir işlev. (Eğer z
global bir değişken olarak erişirse , o zaman saf bir işlev değildir - işlevsel saflıkla kastedilen budur.)
Aşağıdaki açıklamaları okurken yukarıdakileri aklınızda bulundurun:
Örnek Yöntemleri
Bir örnek yöntemi fonksiyonu olan bir işlev ait bir örneği . İşlev, örneği dolaylı olarak bir argüman olarak kabul eder ve örnek, işlev tarafından çıktıyı belirlemek için işlev tarafından kullanılır.
Bir örnek yöntemi için yerleşik bir örnek str.lower:
>>> 'ABC'.lower()
'abc'
str.lower
dize örneğine çağrılır ve hangi yeni dizenin döndürüleceğini bulmak için bu örnekte yer alan bilgileri kullanır.
Sınıf Yöntemleri:
Unutma, Python'da her şey bir nesnedir. Bu, sınıfın bir nesne olduğu ve bir işleve argüman olarak geçirilebileceği anlamına gelir.
A sınıfı bir yöntem bir fonksiyonu olan bir fonksiyondur ve sınıf . Sınıfı bir argüman olarak kabul eder.
Yerleşik bir örnek dict.fromkeys
:
>>> dict.fromkeys('ABC')
{'C': None, 'B': None, 'A': None}
İşlev kendi sınıfını örtük olarak bilir, işlev, çıktısını etkilemek için sınıfı kullanır ve yinelenebilirden bu sınıftan yeni bir tane oluşturur. Bir OrderedDict, aynı yöntemi kullanırken bunu göstermektedir:
>>> from collections import OrderedDict
>>> OrderedDict.fromkeys('ABC')
OrderedDict([('A', None), ('B', None), ('C', None)])
Sınıf yöntemi, ne tür bir sınıf döndürüleceğini etkilemek için sınıfla ilgili bilgileri (ve o sınıfın bir örneğini değil) kullanır.
Statik Yöntemler
"Sınıfını bilmeyen" bir yöntemden bahsediyorsunuz - bu Python'da statik bir yöntemdir. Sadece sınıf nesnesine kolaylık sağlamak için eklenmiştir. İsteğe bağlı olarak başka bir modülde ayrı bir işlev olabilir, ancak çağrı imzası aynı olacaktır.
Statik yöntem, ne sınıf ne de nesnenin bir fonksiyonudur.
Bir statik yöntemin yerleşik bir örneği Python 3'ten str.maketrans'dır.
>>> str.maketrans('abc', 'bca')
{97: 98, 98: 99, 99: 97}
Birkaç argüman verildiğinde, sınıfının bir fonksiyonu olmayan bir sözlük yapar.
Kullanışlı çünkü str
her zaman global isim alanında mevcuttur, böylece çevirme işleviyle kolayca kullanabilirsiniz:
>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
'bcrbabdbcrb'
Python 2'de, string
modülden erişmek zorundasınız :
>>> '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'
Örnek
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
Başlatalım:
>>> instance = AClass()
Şimdi örnek tüm yöntemleri çağırabilir:
>>> 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)
Ancak, sınıfın diğerlerini çağırması beklense de, genellikle örnek yöntemi çağırmak için tasarlanmamıştır:
>>> 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'
Örnek yöntemi çağırmak için örneği açıkça iletmeniz gerekir:
>>> AClass.an_instance_method(instance, 'x', 'y')
('x', 'y', None)