суббота, 10 октября 2020 г.

ЛМНты Python, 81 - 85

>>> Глубина копирования

Метод copy выполняет поверхностное копирование, связывая атрибуты объекта-копии с теми же объектами, с которыми связаны атрибуты объекта-оригинала. Иными словами, объекты, на которые ссылаются атрибуты копируемого объекта, не копируются:

>>> a = [
...     [1, 2, 3],
...     [4, 5, 6]
... ]
>>>
>>> b = a.copy()
>>> b[1][0] = -4
>>> b[1][1] = -5
>>> b[1][2] = -6
>>>
>>> b
[[1, 2, 3], [-4, -5, -6]]
>>> a
[[1, 2, 3], [-4, -5, -6]]
>>>
>>> a[1] is b[1]
True

Для глубокого копирования есть функция deepcopy в модуле copy:

>>> from copy import deepcopy
>>>
>>> a = [
...     [1, 2, 3],
...     [4, 5, 6]
... ]
>>>
>>> b = deepcopy(a)
>>> b[1][0] = -4
>>> b[1][1] = -5
>>> b[1][2] = -6
>>>
>>> b
[[1, 2, 3], [-4, -5, -6]]
>>> a
[[1, 2, 3], [4, 5, 6]]
>>>
>>> a[1] is b[1]
False

>>> from copy import copy, deepcopy

Функции copy и deepcopy из модуля copy пригодятся для копирования объектов собственных классов:

>>> class A(object):
...     """ My useful class """
...     def __init__(self, x):
...         self.x = x
...
>>> a = A([1, 2, 3])
>>>
>>>from copy import copy, deepcopy
>>>
>>> b = copy(a)
>>> a is b
False
>>> a.x is b.x
True
>>>
>>> c = deepcopy(a)
>>> a is c
False
>>> a.x is c.x
False

>>> Перегруженный _

При работе в режиме интерпретатора результат последней операции попадает в переменную _ (подчеркивание):

>>> 1+2
3
>>> _
3
>>> _**3
27

А еще подчеркивание используют для переменных, на которые жалко букву:

>>> for _ in range(3):
...     print('hi')
...
hi
hi
hi
>>> _
2

>>> Инстанс-метод

Определенный в классе инстанс-метод, как правило, вызывается на объекте этого класса. При этом в метод неявно передается сам объект через параметр self:

>>> class A:
...     def whoami(self):
...         print(type(self));
...
>>> a = A()
>>> a.whoami()
<class '__main__.A'>

Однако, этот же метод может быть вызван на классе с явной передачей ему аргумента:

>>> A.whoami(a)
<class '__main__.A'>
>>> A.whoami('hi')
<class 'str'>

Теперь инстанс-метод ведет себя как обычный метод, определенный в пространстве имен A.

>>> Класс-метод

В отличие от инстанс-метода, класс-метод при вызове неявно получает свой класс в качестве аргумента. Для создания класс-метода используется декоратор classmethod:

>>> class C:
...     def __init__(self, n):
...         self.n = n
...
...     @classmethod
...     def one(cls):
...         return cls(1)
...
...     @classmethod
...     def twice_two(cls):
...         return cls(4)
...
>>> one = C.one()
>>> one.n
1
>>> four = C.twice_two()
>>> four.n
4
>>> one.twice_two().n
4
>>> one.n
1

В приведенном примере класс-методы one и twice_two – фабрики преинициализированных объектов класса C.

Первый параметр класс-метода принято назвать cls, также как первый параметр инстанс-метода принято называть self. Это не требование Python, а соглашение разработчиков.

Комментариев нет:

Отправить комментарий