python - 在另一个类中使用实例方法作为装饰器

标签 python mocking instance patch python-decorators

我正在尝试创建一个实例化串行对象的类 (MySerial),以便我可以写入/读取串行设备 (UART)。有一个实例方法是一个装饰器,它包装了一个属于完全不同的类 (App) 的函数。所以装饰器负责写入和读取串行缓冲区。

如果我在 App 类中创建了一个 MySerial 的实例,我就不能使用从 MySerial 创建的装饰器实例方法. 我已尝试使用上述实例方法并使用类方法,如 this second answer 中所述。 ,但我确实需要实例化 MySerial,因此使用 __init__ 创建一个实例。

如何做到这一点?不可能吗?

  • 创建一个作为实例方法的装饰器。
  • 在另一个类中使用这个装饰器

class MySerial():
    def __init__(self):
        pass # I have to have an __init__
    def write(self):
        pass # write to buffer
    def read(self):
        pass # read to buffer
    def decorator(self, func):
        def func_wrap(*args, **kwargs):
            self.write(func(*args, **kwars))
            return self.read()
        return func_wrap

class App():
    def __init__(self):
        self.ser = MySerial()

    @self.ser.decorator  # <-- does not work here.
    def myfunc(self):
        # 'yummy_bytes' is written to the serial buffer via 
        # MySerial's decorator method
        return 'yummy_bytes'

if __name__ == '__main__':
    app = App()

最佳答案

您可以使用staticmethod 来包装decoratordecorator 的内部func_wrap 函数在其签名中包含一个附加参数:clscls 可用于访问 App 实例的 ser 属性,然后是所需的方法 writeread 可以从 cls.ser 调用。另请注意,在您的声明中,MySerial.write 不接受任何参数,但会传递包装函数的结果。下面的代码使用 *args 来防止 TypeError 否则会被引发:

class MySerial():
   def __init__(self):
     pass # I have to have an __init__
   def write(self, *args):
     pass # write to buffer
   def read(self):
     pass # read to buffer
   @staticmethod
   def decorator(func):
     def func_wrap(cls, *args, **kwargs):
        cls.ser.write(func(cls, *args, **kwargs))
        return cls.ser.read()
     return func_wrap

class App():
  def __init__(self):
     self.ser = MySerial()
  @MySerial.decorator 
  def myfunc(self):
    # 'yummy_bytes' is written to the serial buffer via 
    # MySerial's decorator method
    return 'yummy_bytes'

App().myfunc()

关于python - 在另一个类中使用实例方法作为装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50634303/

相关文章:

tdd - 我应该练习 "mockist"还是 "classical"TDD?

python - 从字符串用户输入Python创建类的对象

python - 如何以及在哪里计算 python 中的派生实例变量

python - 如何从数据帧创建网络图

python - 如何将轮廓扩大特定数量的像素(不迭代每个像素)?

python - (Python) 平台游戏 - 角色跳过/放置不正确

java - 如何使用 Mockito 模拟 forEach 行为

java - 我应该如何模拟 Jersey HTTP 客户端请求?

Java - 在没有方法的情况下编辑实例变量

Python matplotlib 频率像素图