【问题标题】:How to modify staticmethod decorator behavior? [closed]如何修改 staticmethod 装饰器行为? [关闭]
【发布时间】:2020-05-23 23:43:53
【问题描述】:

我一直在寻找一种方法来修改 python 中现有的 staticmethod 装饰器以添加自定义行为。比如说,每次使用静态方法时调用类中的另一个方法。

我遇到了 MongoDB 的问题,需要调用一个方法来手动设置集合名称。

以下几点描述了我遇到的问题:

  1. 我创建了一个数据库类,它充当pymongo 的包装器
  2. 我创建了 2 个使用 数据库类 的类,用于与 MongoDB 进行交易
  3. 集合名称作为静态变量分配给每个类
    示例

    • 用户类的集合名称 -> 用户,
    • 测验类的集合名称 -> 测验
  4. 数据库类(包装器)为 Collection 名称维护了自己的 static variable,该名称由在它的帮助下进行事务所需的任何类分配。

    李>
  5. 问题:每当我首先为 Quiz 类进行交易时,它会将 Collection 名称分配给 Database Class,但一旦我使用User 类,Quiz 使用了类的集合名称。

  6. 我在这些类中使用静态方法进行事务处理,我想到的解决方案是修改 staticmethod,使其在每次使用静态方法时自动将 Collection 名称重新分配给数据库类叫做。

【问题讨论】:

  • 创建一个新的装饰器肯定比改变staticmethod的定义更好?
  • 你总是可以创建一个装饰器并用@staticmethod 装饰你的内部函数,但你的 linter 不会很喜欢你。
  • 我不清楚您要完成什么,以及“修改现有的静态方法装饰器”的确切含义。能详细点吗?

标签: python python-3.x mongodb pymongo python-decorators


【解决方案1】:

为@blueteeth 的答案添加替代方案。

这可行,但大多数 linter 都会抱怨它。

def custom_method(func):
    @staticmethod
    def static(*args, **kwargs):
        # do stuff
        func(*args, **kwargs)
    return static

【讨论】:

    【解决方案2】:

    创建一个新的装饰器,而不是调用staticmethod。我认为这会奏效。

    def customstatic(fun):
      def decorator(*args, **kwargs):
        def wrapper():
           return fun(*args, **kwargs)
        # do custom stuff here
        return staticmethod(wrapper)
      return decorator
    

    【讨论】:

      猜你喜欢
      • 2015-01-03
      • 2017-07-16
      • 2023-03-18
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 2014-04-09
      相关资源
      最近更新 更多