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

2023-12-30

我正在尝试创建一个类(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(使用前将#替换为@)

在另一个类中使用实例方法作为装饰器 的相关文章

随机推荐

  • 莱斯的教学目的?

    目的是什么les汇编指令 为什么我们需要加载es部分and寄存器 书中给出了以下例子 les bx p Load p into ES BX mov es bx al Store away AL 为什么我们需要加载es and bx在这种情况
  • node.js 检查远程 URL 是否存在

    如何在不下拉的情况下检查 URL 是否存在 我使用以下代码 但它会下载整个文件 我只需要检查它是否存在 app get api v1 urlCheck function req res var url req query url var r
  • 如何在具有隔离范围的指令中侦听站点范围的事件

    我正在使用具有隔离范围的指令在 angularjs 中创建自定义图表小部件 这个想法是 每个小部件在收到有关如何创建自身的基本配置信息后应该能够独立存在 该小部件将通过侦听 update data 事件与应用程序的其他部分进行通信 当事件被
  • 如何在 SQLite 中插入具有唯一 ID 的重复行?

    这看起来很简单 我想在 SQLite 表中复制一行 INSERT INTO table SELECT FROM table WHERE rowId 5 如果没有显式的唯一列声明 则该语句将起作用 但声明了表的第一列rowID INTEGER
  • 使用ActionCable,多种识别方式

    我使用 ActionCable 开发 Ruby on Rails 5 1 应用程序 通过 Devise 进行用户身份验证 https rubytutorial io actioncable devise authentication 适用于
  • Intellij 调试 Docker 容器不断给我 IO 异常握手失败

    我正在尝试在 Intellij v2020 1 中设置远程调试器 但不断收到以下错误 无法打开调试器端口 localhost 5005 java io IOException 握手失败 连接过早关闭 在我的 docker compose 文
  • 是否可以在cmake中不生成ALL_BUILD项目?

    我不需要 ALL BUILD 子项目 我可以避免生成它吗 谢谢 CMake 问题 16979 正在生成 ALL BUILD 目标 https gitlab kitware com cmake cmake issues 16979 The A
  • Facebook Graph API gem

    我想在我的 Rails 应用程序中使用 Facebook 图形 API 与 FB 图形 API 一起使用的推荐 gem 是什么 Thanks 这是一个写得很好的 FB 图形支持 Ruby https github com nov fb gr
  • 在 SSRS 中复制并粘贴表 (tablix)

    我有一个包含一天数据的 tablix 我需要在底部有相同的数据 但在 3 个不同的行中 我想在底部复制主要日期表 3 次 然后为每个表使用不同的数据集 我尝试复制 tablix 并将其粘贴到Body在 tablix 下方 但出现以下错误 报
  • C#:将数组分配给另一个数组:复制还是指针交换?

    抱歉问这个问题 我一直在谷歌上搜索了一下 但似乎出现的是对克隆或复制方法的引用 而不是我的问题的实际答案C 我有两个字节数组 它们正在被两个线程访问 private byte buffer1 new byte size private by
  • 如何使用 python 读取 CSV 文件时跳过空白行

    这是我的代码 我可以打印每一行 但是当出现空白行时 它会打印 由于CSV文件格式 所以我想在出现空行时跳过 import csv import time ifile open C Users BKA4ABT Desktop Test Spe
  • 如何将输出的 Fortran 二进制 NxNxN 矩阵读入 Python

    我用 Fortran 写出了一个矩阵 如下所示 real kind kind 0 0d0 dimension 256 256 256 dense CALCULATION inquire iolength reclen dense open
  • 如何在不不断扫描的情况下检测目录或文件何时发生更改

    除了读取所有文件并将它们与以前的快照进行比较之外 有没有办法在 Windows 中的 C 中检测目录何时发生更改 如果需要的话 我不介意 PInvoke EDITFileSystemWatcher 类很棒 但有一个问题是您必须启动后台任务
  • 一对一字段 Django 管理员

    编辑为使用一对一字段 我想将建筑物的面积添加到 django modeladmin 中 表结构是 class Area models Model id models IntegerField Buildings db column id a
  • Kubernetes Nginx Ingress 删除部分 URL

    我正在 Kubernetes 在 AKS 上 部署一个简单的应用程序 该应用程序位于使用 Nginx 的 Ingress 后面 并使用 Nginx helm 图表进行部署 我遇到一个问题 由于某种原因 Nginx 似乎没有将完整的 URL
  • AWS lambda读取zip文件执行验证并解压到s3存储桶(如果验证通过)

    我有一个 zip 文件到达 s3 存储桶的要求 我需要使用 python 编写一个 lambda 来读取 zip 文件 执行一些验证并在另一个 S3 存储桶上解压缩 Zip 文件包含以下内容 a csv b csv c csv trigge
  • 读取 HttpPost 响应

    我使用此代码向 http 服务器发送请求 HttpClient client new DefaultHttpClient HttpPost post new HttpPost http 192 168 0 1 test php HttpRe
  • 一步一步 oAuth Rest C# winform 示例 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经尝试了一段时间了 需要从头开始
  • XML RPC - 从 C# 调用 python 函数

    我正在使用库xml rpc net 2 5 0用于在 C 中创建调用一些 python 方法的 XML RPC 客户端 客户端位于Windows7机器中 服务器位于运行red hat的VMWare中 调用python函数的客户端代码 mai
  • 在另一个类中使用实例方法作为装饰器

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