Rahul VB Ответов: 1

Python: декораторы классов, магические методы


Всем Привет,

Я смотрел на декораторов класса. В основном я реализовал класс, оформленный, сделав его вызываемым.

Я добавил некоторую инструкцию print в метод __call__. Я заметил, что оператор print выполняется дважды.

Я сомневался, что магические методы вызываются в тот момент, когда вы создаете экземпляр класса? Или мы ждем явного действия, которое вызовет эти методы.

Последнее верно, но я путаюсь с автоматическим вызовом магических методов

Что я уже пробовал:

>>> class decorator:
	def __init__(self,f):
		self.f=f
	def __call__(self):
		print ('decorated')
		self.f()

		
>>> @decorator
def func():
	print('Hi')

	
>>> func()
decorated
Hi
>>> d = decorator(func)
>>> d()
decorated
decorated
Hi


Как видите, строка "украшен" повторяется дважды. Однако, согласно моему пониманию, выходные данные должны иметь только "украшенную" строку один раз и одну строку из украшенной функции.

Я бы запросил предложения/вклады.

Спасибо и с уважением,
Рахул

1 Ответов

Рейтинг:
2

CPallini

Следующая программа

class decorator:
  def __init__(self,f):
    self.f=f
  def __call__(self):
    print ('decorated')
    self.f()

def func():
  print('Hi')


func()
print("-----------------")
d = decorator(func)
d()

выходы
Hi
-----------------
decorated
Hi

Я не вижу ничего странного в таком выходе.


Rahul VB

Спасибо за попытку. Но я уверен, что видел отпечатки дважды и копирую вставленный вывод из интерпретатора (холостой ход). Давай я попробую так же, как ты, и перепроверю. Спасибо что попробовали :)

Richard MacCutchan

Я не уверен, что полностью понимаю декораторов в Python. Но я предполагаю, что func не является частью decorator класс, но выполняется в результате выполнения self.f() команда. Кроме того, почему вы не нуждаетесь в @... мета-утверждения для него?

Rahul VB

Оператор @ называется украшением:
Например:
def decorator(func):
обертка def():
дополнительный код...
функция()
вернуться оболочки

деф originalFunc():
Print('меня оригинал Функ')

modifiedFunc = декоратор(originalFunc)
modifiedFunc()
- Поэтому, когда я вызываю modifiedFunc, он вызывается с дополнительным кодом внутри оболочки вместе с оригинальной функциональностью.

Вместо того чтобы делать все вышесказанное я могу просто сделать:

@оформитель
деф originalFunc():
Print('меня оригинал Функ')

Теперь, когда я вызываю originalFunc (), он работает именно так, как я показал выше.
Это очень важная функциональность в python. Простая функция может вести себя в соответствии с требованиями по-разному вместе со своим исходным кодом в зависимости от требований.
Итак, в основном мой вопрос касался декораторов классов.

Спасибо,
Рахул

Richard MacCutchan

Кое-что, что мне нужно изучить больше ...