【问题标题】:Get method classname inside decorator at __init__ in python在python中的__init__处获取装饰器内的方法类名
【发布时间】:2012-03-06 19:52:23
【问题描述】:

我正在尝试以某种方式在类 (@classmethod) 中使用装饰器“注册”一个方法,以便以后可以轻松调用它。

到目前为止,我已经尝试在我的装饰器中获取整个“命名空间”,但没有任何结果。

我只能获得__module__,但我无法获得此方法所在的类的名称(因为我在__init__ 期间注册了它,而不是在我的自定义装饰器中的__call__ 期间注册) .

有什么方法可以实现吗?

我认为唯一的方法是inspect 整个文件并以某种方式测试该方法是否存在于每个类中,因此inspect 解决方案也被接受

更多信息

基本上,我正在尝试 fork django-dajaxice 并修改 this 装饰器以便能够注册完整路径函数(包含类名)以便从 AJAX 调用例如 my.namespace.views.MyView.as_view(...)(我知道它更多复杂,我正在尝试简化)

【问题讨论】:

  • 你的问题我不太清楚。你能显示一些代码吗?对您尝试解决的问题进行更广泛的描述也将不胜感激 - 可能有更简单的方法。

标签: python django decorator


【解决方案1】:

您可以使用类装饰器来注册您的方法:

def register_methods(cls):
    for name, method in cls.__dict__.items():
        # register the methods you are interested in

@register_methods
class Foo(object):
    def x(self):
        pass

您可以将其与方法装饰器结合使用,以注释您感兴趣的方法,以便您轻松识别它们。

顺便提一下@classmethod,它是一个内置的装饰器,它返回一个以类作为第一个参数的函数。在这种情况下,您可能不想使用(或模拟)它。

【讨论】:

  • 我喜欢这种方法,但这仍然会降低代码的灵活性,因为每次创建新内容时我都必须手动添加方法。我认为这是不检查模块的唯一方法不是吗?
猜你喜欢
  • 2011-07-01
  • 1970-01-01
  • 2011-03-15
  • 2015-12-06
  • 2012-02-09
  • 2017-09-25
  • 2011-01-19
  • 2023-03-14
  • 2019-12-20
相关资源
最近更新 更多