1. 程式人生 > >Python拾遺之特殊函式 __dict__

Python拾遺之特殊函式 __dict__

class 通過內建成員_ dict _ 儲存成員資訊包括自己(_ dict _ 字典)通過dir函式可以檢視該dict,當類例項成員屬性發生變動時,會呼叫 _ setattr _ ,在這個方法下必須進行對屬性的賦值操作 self._ dict_ [name] = value。若不進行定義 ,如下的self.name = obj[‘name’]語句將無任何意義,若在class中未顯式定義 _ setattr __,直譯器會預設執行該賦值語句。

_obj = dict(name='王記炒麵', code=9527)

class Merchant:

    def
__init__(self, _obj):
self.name = _obj['name'] self.code = _obj['code'] def __setattr__(self, key, value): print ("__setattr__ %s" % key) def set_obj(self, name): self.name = name def test(self): pass if __name__ == '__main__': p = Merchant(_obj) p.set_obj('張記炒麵'
) p.set_obj = '' print dir(p) """執行結果: __setattr__ name //__init__ 初始化階段 __setattr__ code //__init__ 初始化階段 __setattr__ name //p.set_obj('張記炒麵') __setattr__ set_obj //p.set_obj = '' ['__doc__', '__init__', '__module__', '__setattr__', 'set_obj', 'test'] """

跳過_ setattr _的騷操作,但如果如要對屬性進行訪問或者設定做一些控制,過載getattr和setattr還是必要的,例如對code需要僅為10000以下,此時在大於10000的屬性輸入校驗時raise 一個異常

_obj = dict(name='王記炒麵', code=9527)

class Merchant:

    def __init__(self, _obj):
        self.__dict__.update(_obj)

    def __setattr__(self, key, value):
        print ("__setattr__ %s" % key)

    def set_obj(self, name):
        self.name = name

    def test(self):
        pass
if __name__ == '__main__':

    p = Merchant(_obj)
    p.set_obj('張記炒麵')
    p.set_obj = ''
    print dir(p)
"""執行結果:
__setattr__ name
__setattr__ set_obj
['__doc__', '__init__', '__module__', '__setattr__', 'set_obj', 'test']
"""