【问题标题】:Make a decorator call method-specific pre and post methods in a class在类中制作装饰器调用特定于方法的 pre 和 post 方法
【发布时间】:2015-11-10 13:05:18
【问题描述】:

在 python 3 中,我有一个基类,从中派生出一个类:

class Base:
    # Tell the Base class to look and for pre/post 
    # functions the same name, and call them
    def f(self):
        print("f()")

    def no_prepost(self): # should work, too
        print("nothing")

class Derived(Base):
    def pre_f(self):
        print("pre_f()")

    def post_f(self):
        print("post_f()")

如果存在,我想调用 pre/post 方法,但没有一直明确说明它们:

foo = Derived()

# if exists: foo.pre_f() -- too verbose, do this automatically!
foo.f()
# if exists: foo.post_f()

【问题讨论】:

    标签: python decorator introspection python-decorators


    【解决方案1】:

    装饰器函数和一些类内省可以做到这一点。如果找到匹配的函数,则使用相同的参数调用它:

    def prepost(f):
        def prepost_wrapper(self, *args, **kwargs):
            pre_name  = 'pre_'  + f.__name__
            post_name = 'post_' + f.__name__
            if hasattr(self, pre_name):  getattr(self, pre_name) (*args, **kwargs)
            ret = f(self, *args, **kwargs)
            if hasattr(self, post_name): getattr(self, post_name)(*args, **kwargs)
            return ret
        return prepost_wrapper
    
    class Base:
        @prepost    
        def f(self, a, b=99):
            print("f()", a, b)
        @prepost
        def missing(self):
            print("nothing special here")
    
    class Derived(Base):
        def pre_f(self, a, b=0): # the arguments must match!
            print("pre_f()", a, b)
        def post_f(self, a, b=1):
            print("post_f()", a, b)
    
    foo = Derived()
    foo.f("abc")
    foo.missing()
    foo.f("xyz", 12)
    

    输出:

    pre_f() abc 0
    f() abc 99
    post_f() abc 1
    nothing special here
    pre_f() xyz 12
    f() xyz 12
    post_f() xyz 12
    

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 1970-01-01
      • 2023-03-15
      • 2013-02-14
      • 2015-03-17
      • 2014-01-14
      • 2012-09-11
      • 2020-01-11
      • 2021-09-12
      相关资源
      最近更新 更多