我正在尝试创建一个类(MySerial
)实例化一个串行对象,以便我可以写入/读取串行设备(UART)。有一个实例方法是一个装饰器,它包装了属于完全不同的类的函数(App
)。因此装饰器负责写入和读取串行缓冲区。
如果我创建一个实例MySerial
在 - 的里面App
类,我无法使用从中创建的装饰器实例方法MySerial
。
我已经尝试过前述实例方法并使用类方法,如中所述这第二个答案 https://stackoverflow.com/questions/1263451/python-decorators-in-classes,但我真的需要实例化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
包裹decorator
。内部func_wrap
的函数decorator
其签名中包含一个附加参数:cls
. cls
可以用来访问ser
的实例的属性App
,然后是所需的方法write
and read
可以从调用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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)