用于自动绑定(bind) __init__ 参数的 Python 装饰器

标签 python initialization decorator

有没有办法自动绑定(bind)到 self (部分)__init__ 方法的参数?

我的意思是:

class Person:
    @lazy_init
    def __init__(self, name, age, address):
        ...

... 而不是:

class Person:
    def __init__(self, name, age, address):
        self.name = name
        self.age = age
        self.address = address
        ...

我想知道人们是否已经在这种情况下使用过类似的东西。或者有什么理由我一开始就不应该这样做?

最佳答案

这绝对是可能的,这里有一个有点幼稚的实现:

from functools import wraps

def lazy_init(init):
    import inspect
    arg_names = inspect.getargspec(init)[0]

    @wraps(init)
    def new_init(self, *args):
        for name, value in zip(arg_names[1:], args):
            setattr(self, name, value)
        init(self, *args)

    return new_init

class Person:
    @lazy_init
    def __init__(self, name, age):
        pass

p = Person("Derp", 13)
print p.name, p.age

一旦您开始拥有映射到属性的属性以外的东西,您就会遇到麻烦。您至少需要某种方法来指定将哪些参数初始化为属性……到那时,它只会变得比它的值(value)更麻烦。

关于用于自动绑定(bind) __init__ 参数的 Python 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5048329/

相关文章:

python - 在 Python 中将 Sparse.LIL 矩阵保存到 csv

ruby-on-rails - 如何对我的 Rails 应用程序的启动进行基准测试?

java - 如何将 Iterable<interface> 返回类型方法重写为 Iterable<?扩展接口(interface)>返回类型方法

python - Python RESTful API 的单元测试

python - 查找字符串是否存在于 Python 的嵌套元组中

swift - 初始化程序委托(delegate)的要点是什么?

python - 在 Python 中初始化对象类时是否应该运行一个函数?

c++ - 访问冲突 - 为什么基类析构函数被调用两次?

python - 在继承类中重写抽象类的装饰器

python - 在混合调试中没有为 C++ 加载符号(来自 Python)