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

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

為什么 __dict__ 不包含類成員,除非使用直接初始化?

為什么 __dict__ 不包含類成員,除非使用直接初始化?

慕沐林林 2023-10-06 16:46:44
我需要訪問類方法中的類成員列表,特別是在__init__()函數中,以便集體初始化它們。我嘗試使用__dict__andvars(self)但不幸的是它們返回空dict對象,除非使用直接初始化,例如self.y=5. 問題是:為什么它是空的,我如何立即初始化它們,或者本質上變量__dict__適合批量初始化?謝謝示例代碼是這樣的:class P:    def __init__(self):        print("inside __init__() :",self.y,self.__dict__)    x=8    y=9p=P()print(" y is: ", p.y)print("and __dict__ is:",p.__dict__)輸出:inside __init__() : 9 {} y is:  9and __dict__ is: {}Python版本:3.8.5測試的操作系統:windows 10、MacOS 10.15.7 和 Linux CentOS 7
查看完整描述

2 回答

?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

Python 類實例是動態的 - 在您將它們放在那里之前它們沒有變量(請參見下面的注釋)。他們對這些變量應該是什么沒有任何預先了解。通常這是通過將它們一一添加(例如,self.foo = 1)__init__或類中的其他方法來完成的。但如果您有不同的變量源,則可以通過添加到 來實現self.__dict__。假設我有 CSV 文件中的一行,并且我想要一個由該行初始化的類。我可以


class P:

    cell_names = ('a', 'b', 'c')


    def __init__(self, row):

        print("before", self.__dict__)

        self.__dict__.update(zip(self.cell_names, row))

        print("after", self.__dict__)


p = P((1,2,3))

print("attributes", p.a, p.b, p.c)

輸出


before {}

after {'a': 1, 'b': 2, 'c': 3}

attributes 1 2 3

當然,還有其他初始化方法。這取決于您的“整體”數據的來源是什么。


如果您想添加所有關鍵字參數,您可以


class P1:

    def __init__(self, **kw):

        self.__dict__.update(kw)


p = P1(a=1, b=3, c=3)

print("P2", p.a, p.b, p.c)

(注意:您可以使用__slot__在類中預定義變量。這些變量繞過實例字典)


查看完整回答
反對 回復 2023-10-06
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

_dict__只保存實例屬性。在你的例子中是x屬性。是一個可以表示許多不同事物的表達方式;實際結果取決于哪個查找首先成功。yself.x

當您進行類似 的分配時self.x = 5,該值將與中的5鍵相關聯。xself.__dict__

當您嘗試獲取 的值時self.x首先嘗試的是self.__dict__['x']。但如果失敗了,它會嘗試P.x。如果失敗,它將檢查MRO 中x每個祖先的屬性,直到找到值。P如果沒有找到任何內容,AttributeError則會引發 an。__getattr__(這忽略了or的使用__getattribute__,但足以解釋如何在為空self.x時提供值。)self.__dict__


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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