Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Что такое магические методы? Это специальные методы обектов, с помощью которых вы
можете добавить в ваши классы «магию». Они всегда обрамлены двумя нижними
подчеркиваниями (например, __init__ или __lt__).
9. Декторатор. Замикання.
Декораторы — это, по сути, "обёртки", которые дают нам возможность изменить поведение
функции, не изменяя её код.
@my_shiny_new_decorator
... def another_stand_alone_function():
... print("Оставь меня в покое")
...
>>> another_stand_alone_function()
То есть, декораторы в python — это просто синтаксический сахар для конструкций вида:
another_stand_alone_function = my_shiny_new_decorator(another_stand_alone_function)
>>> add_two(3)
5
>>> print(x)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
print(x)
NameError: name 'x' is not defined
>>> add_four(5)
x=2
7
>>> x = 4
>>> def fun():
print(x+3)
>>> fun()
7
В приведенном выше коде переменная x – это global переменная. Доступ к ней можно
получить из любой функции объявленной в данном модуле. Но если мы этот модуль
импортируем в каком-то другом модуле, то x для него уже не будет переменной
уровня global.
Built-in
Уровень Python интерпретатора. В рамках этой области видимости находятся
функции open, len и т.п., также туда входят исключения. Эти сущности доступны в любом
модуле Python и не требуют предварительного импорта. Built-in – это максимально широкая
область видимости.
threadId = 1
def factorial(n):
global threadId
if n < 1:
print "%s: %d" % ("Thread", threadId )
threadId += 1
return 1
else:
returnNumber = n * factorial( n - 1 ) # рекусрсивынй вызов
print(str(n) + '! = ' + str(returnNumber))
return returnNumber
start_new_thread(factorial,(5, ))
start_new_thread(factorial,(4, ))
Принцип работы прост. Потоки удерживают GIL, пока выполняются. Однако они
освобождают его при блокировании для операций ввода-вывода. Каждый раз, когда поток
вынужден ждать, другие, готовые к выполнению, потоки используют свой шанс запуститься.
class A:
def _private(self):
print("Это приватный метод!")
>>> a = A()
>>> a._private()
Это приватный метод!
Двойное подчеркивание в начале имени атрибута даёт большую защиту: атрибут становится
недоступным по этому имени.
>>>
>>> class B:
... def __private(self):
... print("Это приватный метод!")
...
>>> b = B()
>>> b.__private()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'B' object has no attribute '__private'
Однако полностью это не защищает, так как атрибут всё равно остаётся доступным под
именем _ИмяКласса__ИмяАтрибута:
>>>
>>> b._B__private()
Это приватный метод!
Наследование
Наследование подразумевает то, что дочерний класс содержит все атрибуты родительского
класса, при этом некоторые из них могут быть переопределены или добавлены в дочернем.
Например, мы можем создать свой класс, похожий на словарь:
>>>
Класс Mydict ведёт себя точно так же, как и словарь, за исключением того, что метод get по
умолчанию возвращает не None, а 0.
>>>
>>> b['c'] = 4
>>> print(b)
{'a': 1, 'c': 4, 'b': 2}
>>> print(a.get('v'))
None
>>> print(b.get('v'))
0
Полиморфизм
Полиморфизм - разное поведение одного и того же метода в разных классах. Например, мы
можем сложить два числа, и можем сложить две строки. При этом получим разный
результат, так как числа и строки являются разными классами.
>>>
>>> 1 + 1
2
>>> "1" + "1"
'11'
класс C (объект):
@classmethod
def fun (cls, arg1, arg2, ...):
....
fun: функция, которую нужно преобразовать в метод класса
возвращает: метод класса для функции.
Метод класса - это метод, который привязан к классу, а не к объекту класса.
У них есть доступ к состоянию класса, так как он принимает параметр класса, который
указывает на класс, а не на экземпляр объекта.
Он может изменять состояние класса, которое будет применяться ко всем экземплярам
класса. Например, он может изменить переменную класса, которая будет применима ко
всем экземплярам.
Статический метод
класс C (объект):
@staticmethod
def fun (arg1, arg2, ...):
...
возвращает: статический метод для функции fun.
Статический метод - это также метод, который связан с классом, а не с объектом класса.
Статический метод не может получить доступ или изменить состояние класса.
Он присутствует в классе, потому что имеет смысл, чтобы метод присутствовал в классе.
Метод класса против статического метода
Метод класса принимает cls в качестве первого параметра, в то время как статический метод
не нуждается в особых параметрах.
Метод класса может получить доступ или изменить состояние класса, в то время как
статический метод не может получить доступ или изменить его.
В общем, статические методы ничего не знают о состоянии класса. Это методы служебного
типа, которые принимают некоторые параметры и работают с этими параметрами. С другой
стороны, методы класса должны иметь класс в качестве параметра.
Мы используем декоратор @classmethod в python для создания метода класса и используем
декоратор @staticmethod для создания статического метода в python.
Когда использовать что?
Обычно мы используем метод класса для создания фабричных методов. Методы фабрики
возвращают объект класса (аналог конструктора) для разных вариантов использования.
Обычно мы используем статические методы для создания служебных функций.