第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

自動(dòng)初始化實(shí)例變量?

自動(dòng)初始化實(shí)例變量?

我有一個(gè)看起來(lái)像這樣的python類(lèi):class Process:    def __init__(self, PID, PPID, cmd, FDs, reachable, user):其次是:        self.PID=PID        self.PPID=PPID        self.cmd=cmd        ...有沒(méi)有辦法自動(dòng)初始化這些實(shí)例變量,例如C ++的初始化列表?它將節(jié)省大量冗余代碼。
查看完整描述

3 回答

?
POPMUISE

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'



查看完整回答
反對(duì) 回復(fù) 2019-12-12
?
蝴蝶不菲

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í),這尤其合適。



查看完整回答
反對(duì) 回復(fù) 2019-12-12
?
DIEA

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



查看完整回答
反對(duì) 回復(fù) 2019-12-12
  • 3 回答
  • 0 關(guān)注
  • 585 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)