Python 用属性替换实例的属性
我想用属性覆盖属性,但仅在一个实例上。 以下是我试图解决它的方法,但它没有达到我想要的效果:Python 用属性替换实例的属性,python,Python,我想用属性覆盖属性,但仅在一个实例上。 以下是我试图解决它的方法,但它没有达到我想要的效果: class Foo: def __init__(self): self.bar = True self._hidden = False a = Foo() print(a.bar) a.bar = property(lambda self: self._hidden) print(a.bar) >>> C:\Users\Ilya\AppDa
class Foo:
def __init__(self):
self.bar = True
self._hidden = False
a = Foo()
print(a.bar)
a.bar = property(lambda self: self._hidden)
print(a.bar)
>>> C:\Users\Ilya\AppData\Local\Programs\Python\Python37-32\python.exe C:/Users/Ilya/pydolons/experiment.py
>>> True
>>> <property object at 0x0323B960>
能做到吗
不可能
属性是描述符,描述符只能在类级别声明
允许实例描述符是错误的
如果可以将此实例迁移到其他类,则可以执行以下操作:
def attach_property(instance, key, prop):
class Derived(instance.__class__):
pass
setattr(Derived, key, prop)
instance.__class__ = Derived
您可以这样使用:
a = Foo()
print(a.bar)
attach_property(a, "bar", property(lambda self: self._hidden))
print(a.bar)
我是否可以动态创建一个类的副本,并将其放在那里以不影响其他实例?您可以让这些实例成为不同类的实例,并且可以动态创建类(例如,作为所需类的子类),因此。。我猜?@ikamen我不知道我是否理解你的意思,但我在编辑中提出了一个建议。太棒了!我相信它甚至会通过isinstance()检查,你知道这个解决方案有什么缺点吗?@ikamen除了令人惊讶的是,这个实例实际上不再是其他实例的同一类型,以及解决方案的普遍古怪性,实际上并非如此。
a = Foo()
print(a.bar)
attach_property(a, "bar", property(lambda self: self._hidden))
print(a.bar)