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

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

如何在python中從變量參數(kwargs)設置類屬性

如何在python中從變量參數(kwargs)設置類屬性

MMTTMM 2019-11-11 13:10:22
假設我有一個帶有構造函數(或其他函數)的類,該類接受可變數量的參數,然后有條件地將其設置為類屬性。我可以手動設置它們,但似乎變量參數在python中足夠普遍,因此應該有一個共同的習慣用法。但是我不確定如何動態地執行此操作。我有一個使用eval的示例,但這并不安全。我想知道正確的方法-也許用lambda嗎?class Foo:    def setAllManually(self, a=None, b=None, c=None):        if a!=None:             self.a = a        if b!=None:            self.b = b        if c!=None:            self.c = c    def setAllWithEval(self, **kwargs):        for key in **kwargs:            if kwargs[param] != None                eval("self." + key + "=" + kwargs[param])
查看完整描述

3 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

您可以__dict__使用關鍵字參數更新屬性(以字典的形式表示類屬性):


class Bar(object):

    def __init__(self, **kwargs):

        self.__dict__.update(kwargs)

那么你也能:


>>> bar = Bar(a=1, b=2)

>>> bar.a

1

和類似的東西:


allowed_keys = {'a', 'b', 'c'}

self.__dict__.update((k, v) for k, v in kwargs.items() if k in allowed_keys)

您可以預先過濾鍵(如果您仍在使用Python 2.x,請使用iteritems代替items)。


查看完整回答
反對 回復 2019-11-11
?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

您可以使用以下setattr()方法:


class Foo:

  def setAllWithKwArgs(self, **kwargs):

    for key, value in kwargs.items():

      setattr(self, key, value)

有一種類似的getattr()方法來檢索屬性。


查看完整回答
反對 回復 2019-11-11
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

我提出了fqxp答案的一種變體,除了允許的屬性外,還可以讓您設置屬性的默認值:


class Foo():

    def __init__(self, **kwargs):

        # define default attributes

        default_attr = dict(a=0, b=None, c=True)

        # define (additional) allowed attributes with no default value

        more_allowed_attr = ['d','e','f']

        allowed_attr = list(default_attr.keys()) + more_allowed_attr

        default_attr.update(kwargs)

        self.__dict__.update((k,v) for k,v in default_attr.items() if k in allowed_attr)

這是Python 3.x代碼,對于Python 2.x,您需要至少進行一次調整,iteritems()以代替items()。


查看完整回答
反對 回復 2019-11-11
  • 3 回答
  • 0 關注
  • 1232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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