我正在尝试创建一个实例化串行对象的类 (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
来包装decorator
。 decorator
的内部func_wrap
函数在其签名中包含一个附加参数:cls
。 cls
可用于访问 App
实例的 ser
属性,然后是所需的方法 write
和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()
关于python - 在另一个类中使用实例方法作为装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50634303/