【发布时间】:2018-11-11 01:22:33
【问题描述】:
我正在尝试创建一个实例化串行对象的类 (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()
【问题讨论】:
-
只需使用
__init__中的长格式,例如self.myfunc = self.ser.decorator(self.myfunc) -
@AChampion 谢谢,但我有 60 多个功能需要处理。我把自己置于一个棘手的境地。
标签: python mocking instance patch python-decorators