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\AppData\Local\Programs\Python\Python37-32\python.exe C:/Users/Ilya/pydolons/experiment.py
>>> True
>>> <property object at 0x0323B960>

可以吗?启用类属性而不是在实例上设置的 dunder 调用的实际机制是什么?

下面的代码做了我想做的,但它修改了类:

class Foo:
    def __init__(self):
        self.bar = True
        self._hidden = False

a = Foo()
print(a.bar)
Foo.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
>>> False

最佳答案

Can it be done?

不能。

属性是一个描述符,描述符只能在类级别声明。

允许实例描述符是 proposed, but rejected .


如果您愿意将此实例迁移到不同的类,您可以这样做:

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)

关于python - 用属性替换实例的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743921/

相关文章:

python - 在 Selenium Python 中获取 URL

python - python中等效的C/C++ losose算法是什么

python - 示例项目的 Google App Engine "Error: Server Error"

python - Django View 限制子查询

python - 如何将qint32的结果转换为quint8

python - 添加到整数列表的列表

Python:修改属性值

python - Pygame 将光标更改为操作系统光标

python - python中alpha排序最快的列表

python 3 : Formatting a string with multiple same keywords but unique strings to replace them