最近在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)