Python:动态分配实例方法作为实例属性有什么问题

Nik*_*tio 9 python oop

我想出了以下代码来使用装饰器来装饰实例方法,该装饰器需要将实例本身作为参数:

from functools import wraps

def logging_decorator(tricky_instance):
    def wrapper(fn):
        @wraps(fn)
        def wrapped(*a, **kw):
            if tricky_instance.log:
                print("Calling %s.." % fn.__name__)
            return fn(*a, **kw)
        return wrapped
    return wrapper     

class Tricky(object):
    def __init__(self, log):
        self.log = log
        self.say_hi = logging_decorator(self)(self.say_hi)

    def say_hi(self):
       print("Hello, world!")


i1 = Tricky(log=True)
i2 = Tricky(log=False)

i1.say_hi()
i2.say_hi()
Run Code Online (Sandbox Code Playgroud)

这似乎很有效,但我担心我可能忽略了这个技巧的一些无意识的副作用.我是要在脚下拍自己,还是这样安全?

请注意,我实际上并不想将其用于日志记录,这只是我能想到的最有意义的例子.

Nik*_*tio 2

我想我是在试图变得不必要的聪明。似乎有一个更简单的解决方案:

from functools import wraps

def logging_decorator(fn):
    @wraps(fn)
    def wrapped(self, *a, **kw):
        if self.log:
            print("Calling %s.." % fn.__name__)
        return fn(self, *a, **kw)
    return wrapped

class Tricky(object):
    def __init__(self, log):
        self.log = log

    @logging_decorator
    def say_hi(self):
       print("Hello, world!")

i1 = Tricky(log=True)
i2 = Tricky(log=False)

i1.say_hi()
i2.say_hi()
Run Code Online (Sandbox Code Playgroud)