Skip to main content
 首页 » 编程设计

python之包装一个 Python 对象

2025年05月04日20luoye11

我想将 Python 对象序列化为 plist 格式(这可以使用 pliSTLib 完成)。我的想法是编写一个包装其他对象的 PlistObject 类:

def __init__(self, anObject): 
     self.theObject = anObject 

并提供了一个“write”方法:

def write(self, pathOrFile): 
    plistlib.writeToPlist(self.theObject.__dict__, pathOrFile) 

现在,如果 PlistObject 的行为就像包装对象本身一样,那就太好了,这意味着所有属性和方法都以某种方式“转发”到包装对象。我意识到方法 __getattr__ 和 __setattr__ 可以用于复杂的属性操作:

    def __getattr__(self, name): 
         return self.theObject.__getattr__(name) 

但是我当然遇到了构造函数现在产生无限递归的问题,因为 self.theObject = anObject 也尝试访问包装的对象。

我怎样才能避免这种情况?如果整个想法看起来很糟糕,也请告诉我。

请您参考如下方法:

除非我遗漏了什么,否则它会工作得很好:

def __getattr__(self, name): 
    return getattr(self.theObject, name) 

编辑:对于那些认为查找 self.theObject 会导致对 __getattr__ 的无限递归调用的人,让我告诉你:

>>> class Test: 
...     a = "a" 
...     def __init__(self): 
...         self.b = "b" 
...     def __getattr__(self, name): 
...         return 'Custom: %s' % name 
...  
>>> Test.a 
'a' 
>>> Test().a 
'a' 
>>> Test().b 
'b' 
>>> Test().c 
'Custom: c' 

__getattr__ 仅作为 last 调用resort .由于可以在 __dict__ 中找到 theObject,因此不会出现任何问题。