【问题标题】:How to properly decorate a class in python如何在python中正确装饰一个类
【发布时间】:2012-10-15 20:39:44
【问题描述】:

我在执行此操作时遇到了一些问题。目前我有一个模块,里面有一堆类,其中一些类将被装饰以指示一些东西。

我想要创建一个只包含装饰类的新的假模块。所以是这样的:

class FakeModule: pass

def Decorator(cls):
    attr = getattr(RealModule, cls)
    setattr(FakeModule, cls, attr)

有什么建议吗?我对 python 和 python 装饰器很陌生,所以我不太确定这样做的正确方法是什么。

【问题讨论】:

  • 我对你使用“模块”这个词感到困惑。还有你想要完成的事情。以及为什么。
  • 基本上我有一个包含一堆测试类的文件。其中一些测试类将使用@Decorator() 进行修饰。在其他地方我有类似的东西:FunctionWhichDoesStuffWithTestClasses(file_with_classes)。我需要的是 file_with_classes 是“仅”装饰的类,因此我尝试动态创建。
  • 1.你是什​​么意思“测试”类 - 测试类,或者更像是“实践”类? 2. 我还是不明白你想要完成什么。你读过任何装饰器文档吗? wiki.python.org/moin/PythonDecorators
  • 对不起,它们基本上只是测试类。我想要完成的是,基于这些装饰器,一些测试类应该加载,而另一些则不应该......

标签: python module decorator


【解决方案1】:

我想要创建一个只包含装饰类的新的假模块

如果装饰器在一个类上设置了一些独特的属性或值,那么你可以从一个模块中获取所有类并使用inspect模块过滤它们:

def is_decorated_class(cls, _sentinel=object()):
    return (inspect.isclass(cls) and 
            getattr(cls, "some_attr", _sentinel) == value)

name_class_pairs = inspect.getmembers(realmodule, is_decorated_class)

【讨论】:

  • 我已经或多或少地这样做了,问题是它发生在装饰之后。 IE。装饰所有类,设置属性,然后稍后检查属性并决定加载它。我们需要它在装饰时(即在装饰器方法本身中添加有问题的类)
  • @user1161306:只需在装饰器中调用setattr(fakemodule, classname, classobject)
猜你喜欢
  • 2019-11-17
  • 2021-11-21
  • 2021-09-30
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2012-12-04
相关资源
最近更新 更多