代码之家  ›  专栏  ›  技术社区  ›  c z

在python中将对象标记为已删除

  •  2
  • c z  · 技术社区  · 7 年前

    我的python应用程序中有一组用户创建的对象。

    如果用户删除其中一个对象,仅用于错误检查,我想将其标记为已被删除,以便以后使用该对象的任何尝试都会导致错误。

    我考虑了一些选择:

    • del :这将删除引用并保留所有悬挂引用的完整性。
    • __dict__.clear() 这让人困惑 AttributeError 当访问对象时,删除所有可能有助于跟踪该对象的信息

    我也考虑过 __getattribute__ 然而,改变这种情况似乎是无效的。

    class MyClass:
        def __init__( self ):
            self.a = 1
            self.b = 2
            self.c = 3
    
    m = MyClass()
    
    print( m.a )
    print( m.b )
    print( m.c )
    
    
    def fn_deleted( self, attribute ):
        raise ValueError( "This object should have been deleted :(" )
    
    
    m.__getattribute__ = fn_deleted
    
    print( m.a ) # <-- NO ERROR
    

    我觉得应该有一个简单的方法来检查悬而未决的参考资料。有什么想法吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Attack68    7 年前
    class MyClass(object):
        def __init__( self ):
            self.a = 1
            self.b = 2
            self.c = 3
            self.__deleted__ = dict()
    
        def __delattr__(self, item):
            value = self.__getattribute__(item)
            self.__deleted__[item] = value
            # optional actually delete attribute..
            super().__delattr__(item)
    
        def __getattribute__(self, item):
            if item == '__deleted__':
                return super().__getattribute__(item)
            elif item in self.__deleted__:
                print('item has been deleted, prev value: {}'.format(self.__deleted__[item]))
            else:
                return super().__getattribute__(item)
    
    m = MyClass()
    print( m.a )
    del m.a
    print( m.a )
    
    ---------------------------
    1
    item has been deleted, prev value: 1
    None