python - 自动初始化实例变量?

标签 python class initialization-list

我有一个如下所示的 python 类:

class Process:
    def __init__(self, PID, PPID, cmd, FDs, reachable, user):

接着是:

        self.PID=PID
        self.PPID=PPID
        self.cmd=cmd
        ...

有没有办法自动初始化这些实例变量,比如 C++ 的初始化列表?它将节省大量冗余代码。

最佳答案

你可以使用装饰器:

from functools import wraps
import inspect

def initializer(func):
    """
    Automatically assigns the parameters.

    >>> class process:
    ...     @initializer
    ...     def __init__(self, cmd, reachable=False, user='root'):
    ...         pass
    >>> p = process('halt', True)
    >>> p.cmd, p.reachable, p.user
    ('halt', True, 'root')
    """
    names, varargs, keywords, defaults = inspect.getargspec(func)

    @wraps(func)
    def wrapper(self, *args, **kargs):
        for name, arg in list(zip(names[1:], args)) + list(kargs.items()):
            setattr(self, name, arg)

        for name, default in zip(reversed(names), reversed(defaults)):
            if not hasattr(self, name):
                setattr(self, name, default)

        func(self, *args, **kargs)

    return wrapper

用它来装饰 __init__ 方法:

class process:
    @initializer
    def __init__(self, PID, PPID, cmd, FDs, reachable, user):
        pass

输出:

>>> c = process(1, 2, 3, 4, 5, 6)
>>> c.PID
1
>>> dir(c)
['FDs', 'PID', 'PPID', '__doc__', '__init__', '__module__', 'cmd', 'reachable', 'user'

关于python - 自动初始化实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1389180/

相关文章:

c++ - 使用派生类的初始化列表初始化父类(super class)中类型数组的成员

c++ - 构造函数初始化列表中的ADL

python - 通过将正则表达式转换为 'Str' 从 Python 中的字符串中剥离日期

python - 在 django 1.8 中,如何在设置自定义用户模型时为 post_migrate 和 post_syncdb 信号接收器设置发送方?

javascript - 在 Node.js 中反序列化后将对象与其类重新关联

C++:无法在初始化列表中找到错误编译正常但在启动时导致崩溃

python - 如何以编程方式创建 Google Cloud 存储访问 token python

python - 通过引用将数据添加到 wtforms

javascript - 我应该/必须导出 Javascript ES6 中另一个导出类返回的返回类吗?

java - 在构造期间访问基类字段