强制特定方法运行

Force run of specific method

我不太确定如何用标题来表达。看不懂就改..

我最近遇到了方法链,我非常喜欢用它来完成一些任务。

然后我注意到我在每个方法的末尾调用一个特定的方法,我在想是否有可能在到达链的末尾时强制执行此方法?

事实上,不管链接如何,只用普通的 class 方法是否可以做这样的事情?

例如:

class Alphabet:

    def _use_me(self):
        pass

    def a(self):
        # do some stuff
        self._use_me()
        return self

    def b(self):
        # do some stuff
        self._use_me()
        return self

    def c(self):
        # do some stuff
        self._use_me()
        return self

我想知道是否可以默认只 运行 self._use_me() 而不是在每个方法的末尾调用 self._use_me()

也许我什至想错了,应该改变实施方式?欢迎提出建议。

我找不到与此相关的任何信息 - 但这可能只是由于缺乏知识并且没有在 Google 上使用正确的搜索参数。

context managers想到:

class Alphabet:

    def __init__(self):
        return 
    
    def __enter__(self):
        return self
    
    def __exit__(self, type, value, traceback):
        self._use_me()
        print('exit')

    
    def _use_me(self):
        print('calling _use_me')

    def a(self):
        print('a')

    def b(self):
        print('b')

    def c(self):
        print('c')

# calling it:
with Alphabet() as a:
    a.a()

是的,您可以使用装饰器实现此功能。用于装饰 any/all 函数的装饰器。

试试这个代码:

def use_me(func):
    def wrapper(self):

        # Do some stuff, before the function
        
        func(self)

        # Do some stuff, after the function
        print("called use_me")

    return wrapper

class Alphabet:
    
    @use_me
    def a(self):
        # do some stuff
        print('calling A')

    @use_me
    def b(self):
        # do some stuff
        print('calling B')
        return self

    @use_me
    def c(self):
        # do some stuff
        print('calling B')
        return self

这是它的工作原理:

a = Alphabet()

a.a()
# calling A
# called use_me

a.b()
# calling B
# called use_me

a.c()
# calling C
# called use_me