在调用函数之前注册函数的装饰程序

2024-04-20 13:12:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想装饰barbaz,将它们注册到Container,并在Foo中收集回调。给定python修饰符,这可能吗?你知道吗

class Foo(object):
    results = []
    def __init__(self, app):
        self.app = app
        self.registerAll()

    def registerAll(self):
        self.results.append(self.app.myRegister(self.baz))
        self.results.append(self.app.myRegister(self.bar))

    def baz(self):
        print("baz")

    def bar(self):
        print("bar")

class Container(object):
    funcs = []

    def start(self):
        self.f = Foo(self)

    def myRegister(self, f):
        self.funcs.append(f)
        print("myRegister")
        def callback(res):
            print('cb')
        return callback

x = Container()
x.start()

Tags: selfappobjectfoocontainerdefbarbaz
1条回答
网友
1楼 · 发布于 2024-04-20 13:12:29

您的问题看起来可疑地像一个XY Problem,因为不清楚您最终希望通过注册函数(实际上是类方法)来实现什么。(另请参见What is the XY problem?)不过,这里有一种方法可以做你想做的事情——假设我理解你到目前为止在你的问题中所做的。你知道吗

我做了Container.myRegister()一个classmethod,因为它只引用它所在类的一个属性。我还在Foo类之前定义了Container类,以便装饰器可以引用前者。此外,我删除了registerAll()方法,因为它不再需要了(但是这意味着类属性results现在没有在任何地方被引用,所以可能也应该删除它……)。你知道吗

class Container(object):
    funcs = []

    def start(self):
        self.f = Foo(self)

    @classmethod
    def myRegister(cls, f):
        cls.funcs.append(f)
        print("myRegister")
        def callback(res):
            print('cb')
        return callback

def decorate(cls):
    def decorator(method):
        cls.myRegister(method)
        return method
    return decorator

class Foo(object):
    results = []

    def __init__(self, app):
        self.app = app

    @decorate(Container)
    def baz(self):
        print("baz")

    @decorate(Container)
    def bar(self):
        print("bar")

x = Container()
x.start()

相关问题 更多 >