问题。尽管没有调用类本身,但为什么此代码会按应有的方式重现。有一个假设是由于变量被调用的事实dp,但是我不清楚这有多可靠以及它有多实用。
from aiogram import Bot, Dispatcher, executor, types
import config
bot = Bot(token=config.TOKEN_TESTING, parse_mode=types.ParseMode.MARKDOWN_V2)
dp = Dispatcher(bot)
class SheduleBot:
@dp.message_handler(commands=['today' ])
async def queue(message):
await message.reply("```\nОтправь мне в личку сообщение```\n")
#shedule_bot = SheduleBot()
executor.start_polling(dp, skip_updates=True)
类就在那里,它不是一个对象。为什么装饰器工作 - 因为类内的所有内容(方法的内容除外)在模块加载时立即执行(愚蠢的是,如果你
print在方法之外的类内插入,它将在启动时工作)。因此,创建了方法并执行了装饰器。然后装饰器注册的方法通过调度程序简单地调用。演示代码,没有async,但本质是一样的:
结论:
那些。可以看出它
print在类内部立即生效,并且装饰器在启动时立即执行。如果您还记得装饰器只是一个函数,它接收要装饰的函数并返回另一个函数(或者在这种情况下是相同的,但要装饰的函数由调度程序注册),那就更清楚了。所以这个类可以这样重写:
在这种情况下,一切都会完全一样。
装饰器是 dp 对象的方法这一事实不会以任何方式影响结果,如果装饰器是单独的函数,则行为将完全相同。
装饰器是一个包装器,允许您在函数之前或之后执行某些操作,在您的情况下,此装饰器称为,它在 Dispatcher-e (dp) 中注册您的消息处理程序并使用它来响应用户消息