3 回答
TA贡献1765条经验 获得超5个赞
您可以使用装饰器:
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'
TA贡献1810条经验 获得超4个赞
如果您使用的是Python 2.6或更高版本,则可以使用collections.namedtuple:
>>> from collections import namedtuple
>>> Process = namedtuple('Process', 'PID PPID cmd')
>>> proc = Process(1, 2, 3)
>>> proc.PID
1
>>> proc.PPID
2
当您的班级实际上只是一大包价值观时,这尤其合适。
TA贡献1820条经验 获得超2个赞
对于Python 3.7+,您可以使用Data Class,这是一种非常Python化且可维护的方式来完成您想要的事情。
它允许您为类定义字段,它们是自动初始化的实例变量。
它看起来像这样:
@dataclass
class Process:
PID: int
PPID: int
cmd: str
...
该__init__方法将已经在您的班级中。
请注意,这里需要类型提示,这就是我在示例中使用int和的原因str。如果您不知道字段的类型,则可以使用模块中的任何typing。
与建议的解决方案相比,数据类具有许多优点:
它是明确的:所有字段都是可见的,这尊重Python的Zen并使其可读和可维护。将其与的使用进行比较**kwargs。
它可以有方法。就像其他任何课程一样。
它使您可以超越自动__init__使用__post_init__方法。
- 3 回答
- 0 关注
- 547 浏览
添加回答
举报