3 回答

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
您可以使用裝飾器:
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
用它來(lái)裝飾__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貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果您使用的是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
當(dāng)您的班級(jí)實(shí)際上只是一大包價(jià)值觀時(shí),這尤其合適。

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊
對(duì)于Python 3.7+,您可以使用Data Class,這是一種非常Python化且可維護(hù)的方式來(lái)完成您想要的事情。
它允許您為類(lèi)定義字段,它們是自動(dòng)初始化的實(shí)例變量。
它看起來(lái)像這樣:
@dataclass
class Process:
PID: int
PPID: int
cmd: str
...
該__init__方法將已經(jīng)在您的班級(jí)中。
請(qǐng)注意,這里需要類(lèi)型提示,這就是我在示例中使用int和的原因str。如果您不知道字段的類(lèi)型,則可以使用模塊中的任何typing。
與建議的解決方案相比,數(shù)據(jù)類(lèi)具有許多優(yōu)點(diǎn):
它是明確的:所有字段都是可見(jiàn)的,這尊重Python的Zen并使其可讀和可維護(hù)。將其與的使用進(jìn)行比較**kwargs。
它可以有方法。就像其他任何課程一樣。
它使您可以超越自動(dòng)__init__使用__post_init__方法。
- 3 回答
- 0 關(guān)注
- 585 瀏覽
添加回答
舉報(bào)