亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自動初始化實例變量?

自動初始化實例變量?

天涯盡頭無女友 2019-12-11 14:08:23
我有一個看起來像這樣的python類:class Process:    def __init__(self, PID, PPID, cmd, FDs, reachable, user):其次是:        self.PID=PID        self.PPID=PPID        self.cmd=cmd        ...有沒有辦法自動初始化這些實例變量,例如C ++的初始化列表?它將節省大量冗余代碼。
查看完整描述

3 回答

?
POPMUISE

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'



查看完整回答
反對 回復 2019-12-12
?
蝴蝶不菲

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

當您的班級實際上只是一大包價值觀時,這尤其合適。



查看完整回答
反對 回復 2019-12-12
?
DIEA

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__方法。



查看完整回答
反對 回復 2019-12-12
  • 3 回答
  • 0 關注
  • 589 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號