为什么在__init__函数中声明描述符类会破坏描述符功能?

use*_*753 7 python descriptor

在下面的B类中,我希望__set__每当你赋值时都要调用A类中的函数B().a.而是将值设置为使用值B().a覆盖B().a.C类分配C().a正常工作,但我希望每个用户类都有一个单独的A实例,即我不希望在一个C()实例中更改"a"以在所有其他实例中更改"a".我写了几个测试来帮助说明问题.你能帮我定一个会传递test1和test2的类吗?

class A(object):
    def __set__(self, instance, value):
        print "__set__ called: ", value

class B(object):
    def __init__(self):
        self.a = A()

class C(object):
    a = A()

def test1( class_in ):
    o = class_in()
    o.a = "test"
    if isinstance(o.a, A):
        print "pass"
    else:
        print "fail"

def test2( class_in ):
    o1, o2 = class_in(), class_in()
    if o1.a is o2.a:
        print "fail"
    else:
        print "pass"
Run Code Online (Sandbox Code Playgroud)

nos*_*klo 5

根据文件:

以下方法仅适用于包含该方法的类的实例(所谓的描述符类)出现在另一个新样式类的类字典中,称为所有者类.在下面的示例中,"属性"是指属性,其名称是所有者类中属性的键__dict__.描述符只能作为新式类本身实现.

所以你不能在实例上有描述符.

但是,由于描述符获取了用于访问它的实例的ref,因此只需将其用作存储状态的键,您可以根据实例使用不同的行为.