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

And*_*ima 10 python initialization decorator

有没有办法自动绑定到方法的self(某些)参数__init__

我的意思是:

class Person:
    @lazy_init
    def __init__(self, name, age, address):
        ...
Run Code Online (Sandbox Code Playgroud)

... 代替:

class Person:
    def __init__(self, name, age, address):
        self.name = name
        self.age = age
        self.address = address
        ...
Run Code Online (Sandbox Code Playgroud)

我想知道在这种情况下人们是否已经使用了类似的东西.或者有什么理由我不应该首先这样做?

Adr*_*ian 9

供将来遇到此问题的所有其他人参考(Python 3.7 或更高版本):有一个数据类装饰器可以做到这一点。

例子

from dataclasses import dataclass

@dataclass
class Person:
    name
    age
    address

# other methods...
Run Code Online (Sandbox Code Playgroud)


Mat*_*nen 5

这绝对是可能的,这是一个有点天真的实现:

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

    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
Run Code Online (Sandbox Code Playgroud)

一旦你开始拥有除了映射到属性的属性之外的东西,你就会遇到麻烦.你至少需要一些方法来指定哪些args初始化为属性......在这一点上它会变得比它的价值更麻烦.