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

标签 oop python

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

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()

这似乎很有效,但我担心我可能忽略了这个技巧的一些意想不到的副作用。我会搬起石头砸自己的脚吗?这样安全吗?

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

最佳答案

我不太清楚您为什么要这样做。如果要动态分配新方法类型,请使用 types:

import types

class Tricky(object):
    def __init__(self):
        def method(self):
            print('Hello')
        self.method = types.MethodType(method, self)

如果你想对实例做些什么,在__init__方法中做。如果您只想访问装饰器内的方法实例,您可以使用 im_self 属性:

def decorator(tricky_instance):
    def wrapper(meth):
        print(meth.im_self == tricky_instance)
        return meth
    return wrapper

就我个人而言,我认为这正在转向也许我不应该使用装饰器领域。

关于oop - Python:将实例方法动态分配为实例属性有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7101126/

相关文章:

oop - 猴子补丁还是不猴子?

python - 派生类重载时调用基类方法

oop - Lua 脚本抛出错误 "attempt to call a nil value (field ' 存款')"

c# - 使用其关系中的属性为子类建模的正确方法

python - 测试用户输入 - Python

python - biopython 有没有办法从发表的文章中获取完整的摘要?

python - 重新加载目录中的所有模块

python - 为什么我不能从字典中追加这个值?

python - 如何缓存依赖于其他类属性的方法返回的值?

iphone - 伪私有(private)方法的实现文件中的方法原型(prototype)?