Що таке "класичні методи" та "методи екземпляра" в Python?
"Метод екземпляра" використовує інформацію, що міститься в екземплярі, щоб визначити, яке значення повернути (або який побічний ефект зробити). Вони дуже поширені.
"Метод класу" використовує інформацію про клас (а не екземпляр цього класу) для впливу на те, що він робить (вони зазвичай використовуються для створення нових екземплярів як альтернативних конструкторів, і тому не є надзвичайно поширеними).
"Статичний метод" не використовує жодної інформації про клас чи екземпляр для обчислення того, що він робить. Зазвичай це просто в класі для зручності. (Як такі, вони теж не дуже поширені.)
Функція X
Запам'ятайте математичний клас, "у - це функція х f(x)
,?" Застосуємо це у коді:
y = function(x)
Наголошене на тому, що оскільки x
може змінюватися, y
може змінюватися і при x
зміні. Це мається на увазі, коли ми говоримо, що " y
є функцією x
"
Що буде, y
коли z
є 1
? 2
? 'FooBarBaz'
?
y
не є функцією z
, тому z
може бути що завгодно і не впливати на результат функції, припускаючи, що наша function
є чистою функцією. (Якщо вона має доступ z
до глобальної змінної, то це не є чистою функцією - саме це розуміється під функціональною чистотою.)
Пам’ятайте про вищезазначене, читаючи такі описи:
Методи екземплярів
Метод примірника є функцією , яка є функцією від примірника . Функція приймає екземпляр неявно як аргумент йому, а екземпляр використовується функцією для визначення виходу функції.
Вбудований приклад методу екземпляра str.lower:
>>> 'ABC'.lower()
'abc'
str.lower
викликається екземпляром рядка, і він використовує інформацію, що міститься в екземплярі, щоб з'ясувати, яку нову рядок повернути.
Методи занять:
Пам'ятайте, в Python все є об'єктом. Це означає, що клас є об'єктом, і його можна передавати як аргумент функції.
Метод класу є функцією , яка є функцією від класу . Він приймає клас як аргумент до нього.
Приклад вбудованого dict.fromkeys
:
>>> dict.fromkeys('ABC')
{'C': None, 'B': None, 'A': None}
Функція неявно знає власний клас, функція використовує клас для впливу на вихід функції, і вона створює новий із цього класу з ітерабельного. OrdersDict демонструє це, використовуючи той самий метод:
>>> from collections import OrderedDict
>>> OrderedDict.fromkeys('ABC')
OrderedDict([('A', None), ('B', None), ('C', None)])
Метод класу використовує інформацію про клас (а не екземпляр цього класу), щоб впливати на тип класу для повернення.
Статичні методи
Ви згадуєте метод, який "не знає свого класу" - це статичний метод в Python. Він просто приєднаний для зручності до об’єкта класу. При необхідності це може бути окрема функція в іншому модулі, але його підпис дзвінка був би таким же.
Статичний метод - це функція ні класу, ні об'єкта.
Вбудований приклад статичного методу - це str.maketrans з Python 3.
>>> str.maketrans('abc', 'bca')
{97: 98, 98: 99, 99: 97}
Враховуючи пару аргументів, він складає словник, який не є функцією його класу.
Це зручно, оскільки str
він завжди доступний у глобальному просторі імен, тому ви можете легко використовувати його за допомогою функції перекладу:
>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
'bcrbabdbcrb'
У Python 2 ви маєте доступ до нього з string
модуля:
>>> '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'
Приклад
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
Давайте поміркуємо:
>>> instance = AClass()
Тепер екземпляр може викликати всі методи:
>>> 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)
Але зазвичай клас не призначений для виклику методу екземпляра, хоча, як очікується, викликає інші:
>>> 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'
Вам потрібно буде явно передати екземпляр, щоб викликати метод екземпляра:
>>> AClass.an_instance_method(instance, 'x', 'y')
('x', 'y', None)