Python:自动初始化实例变量? [英] Python: Automatically initialize instance variables?

查看:426
本文介绍了Python:自动初始化实例变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类似这样的python类:

 类进程:
def __init __ ,PPID,cmd,FDs,reachable,user):

后跟:

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

有没有办法自动初始化这些实例变量,如C ++的初始化列表?

编辑:扩展解决方案以符合默认参数



这是完整的解决方案:

  from functools import wraps 
import inspect


def initializer(func):

自动分配参数

> ;> class process:
... @initializer
... def __init __(self,cmd,reachable = False,user ='root'):
... pass
>>>> p = process('halt',True)
>>> p.cmd,p.reachable,p.user
'root')

names,varargs,keywords,defaults = inspect.getargspec(func)

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

名称,默认为zip(反向(名称),反向(默认)):
如果没有hasattr(self,name):
setattr name,default)

func(self,* args,** kargs)

返回wrapper






编辑:Adam要求我扩展解决方案以支持关键字参数

  from functools import wraps 
import inspect

def initializer(fun):
names,varargs,keywords ,defaults = inspect.getargspec(fun)
@wraps(fun)
def wrapper(self,* args,** kargs):
为name, ],args)+ kargs.items():
setattr(self,name,arg)
fun(self,* args,** kargs)
return wrapper






您可以使用装饰器:

  from functools import wraps 
import inspect

def initializer(fun):
names,varargs,keywords,defaults = inspect.getargspec(fun)
@wraps(fun)
def wrapper(self,* args):
name,arg in zip(names [1:],args):
setattr(self,name,arg)
fun(self,* args)
返回包装器

类进程:
@initializer
def __init__ (self,PID,PPID,cmd,FDs,可达,用户):
pass

输出:

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


I have a python class that looks like this:

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

followed by:

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

Is there any way to autoinitialize these instance variables, like C++'s initialization list? It would spare lots of redundant code.

解决方案

Edit: extended the solution to honor default arguments also

Here is the complete solution:

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


Edit: Adam asked me to extend the solution to support keyword arguments

from functools import wraps
import inspect

def initializer(fun):
   names, varargs, keywords, defaults = inspect.getargspec(fun)
   @wraps(fun)
   def wrapper(self, *args, **kargs):
       for name, arg in zip(names[1:], args) + kargs.items():
           setattr(self, name, arg)
       fun(self, *args, **kargs)
   return wrapper


You can use a decorator:

from functools import wraps
import inspect

def initializer(fun):
    names, varargs, keywords, defaults = inspect.getargspec(fun)
    @wraps(fun)
    def wrapper(self, *args):
        for name, arg in zip(names[1:], args):
            setattr(self, name, arg)
        fun(self, *args)
    return wrapper

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

Output:

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

这篇关于Python:自动初始化实例变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆