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

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

Python 循環(huán)遍歷基類中的非繼承屬性

Python 循環(huán)遍歷基類中的非繼承屬性

紅顏莎娜 2021-10-26 18:52:42
我有一個包含數(shù)字屬性的基類,這些屬性在初始化時作為字典簡單地傳遞給它,然后添加到實例的字典中:class baseclass(object):    def __init__(self, **kwargs):        self.__dict__.update(kwargs)    def calcValue(self):        return sum(vars(self).values())現(xiàn)在我有一個從這個類派生的類,它為類添加了額外的屬性,例如;class childclass(baseclass):    def __init__(self, stringValue, **kwargs):        super(childclass, self).__init__(kwargs)        self.name = stringValue現(xiàn)在我想在我的基類中有一個函數(shù),它只迭代添加到類中的所有屬性,而不是作為子屬性添加的屬性。例如,如果我創(chuàng)建一個這樣的子類實例:instance = childclass("myname", a=1, b=2, c=3)然后調(diào)用 calcValue 方法,它應該返回 1+2+3 = 6instance.calcValue()但是因為 vars(self) 將返回完整的字典,不包括來自 childclass 屬性的字符串,當然不能添加。有沒有辦法只訪問屬于各自派生類的實例的屬性?
查看完整描述

2 回答

?
牧羊人nacy

TA貢獻1862條經(jīng)驗 獲得超7個贊

您將所有屬性作為普通值存儲在實例的__dict__. 這意味著,如果沒有任何進一步的提示,它們之間是無法區(qū)分的。


Python 有兩種機制來以特殊方式處理屬性。如果您將在類本身中聲明基類中的屬性,并在__init__方法中初始化它們的值,則可以內(nèi)省基類' __dict__(而不是實例的__dict__)或__annotations__同一類中的屬性。


但是,就像在示例中一樣,一件簡單的事情是使用特殊屬性來記錄添加到基類上的屬性,然后將其作為屬性的名稱來源進行查詢:


class baseclass(object):

    def __init__(self, **kwargs):

        self.__dict__.update(kwargs)

        self._numeric_attrs = set(kwargs.keys())


    def calcValue(self):

        return sum(getattr(self, attr) for attr in self._numeric_attrs)


查看完整回答
反對 回復 2021-10-26
?
慕容森

TA貢獻1853條經(jīng)驗 獲得超18個贊

一個簡單、安全和有效的——但增加了開銷——將基類屬性存儲在一個不同的屬性中并用于__getattr__為它們提供服務:


class BaseClass(object):

    def __init__(self, **kwargs):

        self._attribs = kwargs


    def __getattr__(self, name):

        try:

            return self._attribs[name]

        except KeyError:

            raise AttributeError("object {} has no attribute {}".format(type(self).__name__, name))


    def calcValue(self):

        return sum(self._attribs.values())

我通常會盡量避免,__getattr__因為它會使代碼更難檢查和維護,但由于您的類已經(jīng)沒有明確的 API,因此在這里沒有太大區(qū)別。


查看完整回答
反對 回復 2021-10-26
  • 2 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號