Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用属性替换实例的属性_Python - Fatal编程技术网

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)