繁体   English   中英

如何用类装饰器装饰“可调用”类?

[英]How can I decorate a “callable” class with a class decorator?

我正在寻找装饰一个“可调用”类(一个定义了__call__方法的类),这样我就可以在调用__init__之前启动后台服务,并在调用它之前操作传递的参数以包含服务的详细信息那已经开始了。

所以,例如:

@init_service # starts service on port 5432
class Foo(object):
  def __init__(self, port=9876):
    # init here. 'port' should now be `5432` instead of the original `9876`

  def __call__(self):
    # calls the background service here, using port `5432`

func = Foo(port=9876)
...
result = func()

init_service将具有带有端口号的class属性,以便稍后可以关闭服务。

您正在尝试修补__init__方法; 有一个__call__方法的事实在这里没有任何可能性。

您通常使用常规(函数)装饰器来装饰__init__方法 ; 如果你必须使用类装饰器,那么使用一个子类装饰类:

def init_service(cls):
    class InitService(cls):
        def __init__(self, port='ignored'):
            super(InitService).__init__(5432)

    return InitService

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM