>>> Глубина копирования
Метод 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, а соглашение разработчиков.
Комментариев нет:
Отправить комментарий