0

我想用我自己的班级修补其他班级。我尝试使用Tomonkeypatch.some_func = some_func. 它可以工作,但我想用简洁的方法来做到这一点(即类)。

我正在尝试在热解图中猴子修补消息对象

这是我的代码:

import pyrogram

class Message(pyrogram.types.messages_and_media.Message):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    @property
    def test(self):
       return "test"

当我在我的处理程序中使用代码时

from pyrogram import filters

@client.on_message(filters.private)
async def sometest(client, message):
    s = message.test
    await message.reply(s)
    

我得到:

AttributeError: 'Message' object has no attribute 'test' 

但是,我用热解图修补了猴子?那么为什么?

先感谢您!

4

2 回答 2

1

您必须修补 pyrogram 使用的原始 Message 对象。

from pyrogram.types import Message 

@property
def test(self):
       return "test"

Message.test = test

如果您真的想在更改子类时更新 Message 类(不推荐!),您可以这样做:

from pyrogram.types import Message 

Message.__init_subclass__ = classmethod(lambda sub: [setattr(Message, k, v) for (k,v) in sub.__dict__.items() if k[:2] != '__'])

class MyMessage(Message):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    @property
    def test(self):
        return "test"
于 2021-12-16T16:06:09.807 回答
0

您可能应该创建一个新文件,导入 pyrogram.types.Message,并创建它的子类。

from pyrogram.types import Message

class MyMessage(Message):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    @property
    def test(self):
        return "test"

然后,您可以导入自己的MyMessage而不是 Pyrograms 消息并像往常一样使用它。

于 2021-12-16T12:09:24.487 回答