python self.__dict__的疑问

最近在win32com的库代码中发现了这样一种用法:

class CDispatch:
    def __init__(
        self, IDispatch, olerepr, userName=None, UnicodeToString=None, lazydata=None
    ):
        assert UnicodeToString is None, "this is deprecated and will go away"
        if userName is None:
            userName = "<unknown>"
        self.__dict__["_oleobj_"] = IDispatch
        self.__dict__["_username_"] = userName
        self.__dict__["_olerepr_"] = olerepr
        self.__dict__["_mapCachedItems_"] = {}
        self.__dict__["_builtMethods_"] = {}
        self.__dict__["_enum_"] = None
        self.__dict__["_unicode_to_string_"] = None
        self.__dict__["_lazydata_"] = lazydata

这段代码还重载了__getattr__和__setattr__,有谁知道self.dict[key] = value的操作会调用这些重载方法吗?或者会调用哪些object的方法?

  cv您的代码试炼,看到 self.dict[key] = value 语句只是对类的 dict 属性的值追加了键和值而已。我感觉并没有啥特殊含义啊。

  • 代码
#!/sur/bin/nve python
# coding: utf-8


class CDispatch:
    def __init__(
        self, IDispatch, olerepr, userName=None, UnicodeToString=None, lazydata=None
    ):
        assert UnicodeToString is None, "this is deprecated and will go away"
        if userName is None:
            userName = "<unknown>"
        self.__dict__["_oleobj_"] = IDispatch
        self.__dict__["_username_"] = userName
        self.__dict__["_olerepr_"] = olerepr
        self.__dict__["_mapCachedItems_"] = {}
        self.__dict__["_builtMethods_"] = {}
        self.__dict__["_enum_"] = None
        self.__dict__["_unicode_to_string_"] = None
        self.__dict__["_lazydata_"] = lazydata


if __name__ == '__main__':
    IDispatch = 20230607
    olerepr = 'I am a oldman.'
    userName = '梦幻精灵-cq'
    print('~'*41)
    cd = CDispatch(IDispatch, olerepr, userName)
    print(cd.__dict__)
    print('~'*41)

  • 代码运行效果截屏图片

    img