вызов метода из класса в @ class.method с использованием python - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь создать класс, который в итоге превратится в библиотеку. Чтобы сделать это, я пытаюсь сделать что-то вроде того, что сделал discord.py, и идея исходит из этого.

Код, который создает дискордант:

@bot.event
async def on_ready():
   print('discord bot is ready')

Где '@bot' - это просто объект, который я создал ранее, выполнив

bot = discord()

И .event '- это предварительно запрограммированный и готовый к использованию метод. on_ready () - это функция, которая уже вызывается.

Я хочу иметь способ создать это из моего собственного класса, и оттуда управлять всем кодом, используя функции asyn c.

Как это сделать в моем собственном коде?

1 Ответ

0 голосов
/ 05 апреля 2020

Вам необходимо реализовать класс, методы publi c которого декораторы . Например, этот класс реализует планировщик, который выставляет планирование через декоратор:

class Scheduler:
    def __init__(self):
        self._torun = []

    def every_second(self, fn):
        self._torun.append(fn)

    async def _main(self):
        while True:
            for fn in self._torun:
                asyncio.create_task(fn())
            await asyncio.sleep(1)

    def run(self):
        asyncio.run(self._main())

Вы бы использовали его так:

sched = Scheduler()

@sched.every_second
async def hello():
    print('hello')

@sched.every_second
async def world():
    print('world')

sched.run()

Класс имитирует диссонанс в том смысле, что он имеет run метод, который вызывает asyncio.run для вас. Я бы предпочел вместо этого выставить asyn c main, чтобы пользователь мог вызвать asyncio.run(bot.main()) и иметь возможность контролировать, какое событие l oop используется. Но пример следует соглашению Discord, чтобы API стало более знакомым пользователям discord.py.

...