gpt4 book ai didi

python - 将 Python 类恢复到原始状态

转载 作者:太空狗 更新时间:2023-10-30 02:14:07 25 4
gpt4 key购买 nike

我有一个类,我在其中动态添加了一些属性,有时我想将该类恢复到没有添加属性的原始状态。

情况:

class Foo(object):
pass

Foo.x = 1
# <insert python magic here>
o = Foo() # o should not have any of the previously added attributes
print o.x # Should raise exception

我最初的想法是创建原始类的副本:

class _Foo(object):
pass

Foo = _Foo
Foo.x = 1
Foo = _Foo # Clear added attributes
o = Foo()
print o.x # Should raise exception

但由于 Foo 只是对 _Foo 的引用,所以任何属性也会添加到原始 _Foo 中。我也试过了

Foo = copy.deepcopy(_Foo)

以防万一,但显然没有帮助。

澄清:

用户不需要关心类是如何实现的。因此,它应该具有与“正常定义”类相同的特性,即内省(introspection)、内置帮助、子类化等。这几乎排除了任何基于 __getattr__

的东西

最佳答案

我同意 Glenn 的观点,这是一个非常糟糕的想法。无论如何,这里是你如何使用装饰器来完成它。还要感谢 Glenn 的帖子提醒我您可以从类的字典中删除项目,只是不能直接删除。这是代码。

def resetable(cls):
cls._resetable_cache_ = cls.__dict__.copy()
return cls

def reset(cls):
cache = cls._resetable_cache_ # raises AttributeError on class without decorator
for key in [key for key in cls.__dict__ if key not in cache]:
delattr(cls, key)
for key, value in cache.items(): # reset the items to original values
try:
setattr(cls, key, value)
except AttributeError:
pass

我很纠结是通过捕获尝试更新不可分配属性的尝试来重置值,如我所展示的那样,还是构建此类属性的列表。我会把它留给你。

这是一个用法:

@resetable   # use resetable on a class that you want to do this with
class Foo(object):
pass

Foo.x = 1
print Foo.x
reset(Foo)
o = Foo()
print o.x # raises AttributeError as expected

关于python - 将 Python 类恢复到原始状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3899454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com