成员变量属性的Python属性别名

成员变量属性的Python属性别名,python,properties,python-2.x,Python,Properties,Python 2.x,我想创建一个值为“x.val”的类属性(名为“v”) 其中x是类的属性值 我设计如下代码。。。但当我给属性“v”赋值时,它不起作用, “x.val”的值不变 首先,我创建了一个新的对象PClass,当时,v属性和“x.val”的值相同,都是1,即“x.val”的值 我为“v”指定了一个新值9999。预期的is值“v.val”将更改为9999 但事实并非如此。“v”的值更改为9999,但“v.val”仍为1。 此外,它看起来好像从未达到“setv”功能 我不知道为什么会发生这种情况?任何理想,请让

我想创建一个值为“x.val”的类属性(名为“v”) 其中x是类的属性值

我设计如下代码。。。但当我给属性“v”赋值时,它不起作用, “x.val”的值不变

  • 首先,我创建了一个新的对象PClass,当时,v属性和“x.val”的值相同,都是1,即“x.val”的值

  • 我为“v”指定了一个新值9999。预期的is值“v.val”将更改为9999 但事实并非如此。“v”的值更改为9999,但“v.val”仍为1。 此外,它看起来好像从未达到“setv”功能

  • 我不知道为什么会发生这种情况?任何理想,请让我知道

    谢谢大家

    class ValClass:
    
        def __init__(self):
            self.val = 1
            self.var = 2
    
        def pr(self):
            print "==== PR ===="
            print self.val #1
            print self.var #2   
    
    
    class PClass:
        x = ValClass()
        y = '1'
    
        def getv(self):
            return self.x.val
    
        def setv(self, val):
            self.x.val = val
    
        def delv(self):
            del self.x.val
    
        v = property(getv, setv, delv)
    
        def solv(self):
            print self.v #9999
            self.x.pr()
    
    
    
    
    if __name__ == '__main__':
        p = PClass()
        p.v = 9999
        print p.v
        p.solv()
    

    setv
    未调用,将
    class-PClass:
    更改为
    class-PClass(对象):
    使PClass成为对象的子类

    setv
    未调用,将
    class-PClass:
    更改为
    class-PClass(对象):
    使PClass成为object的子类

    属性
    只能用于新样式的类。如果您的类不继承自
    对象
    ,则无法实现属性

    class PClass(object):
        def __init__(self):
            self.x = ValClass() # if you don't do this, all PClass objects will share an x
            self.y = 1
    
        @property
        def v(self):
            return self.x.val
        @v.setter
        def v(self, val):
            self.x.val = val
        @v.deleter
        def v(self):
            del self.x.val
    
        def solv(self):
            print self.v #9999
            self.x.pr()
    

    属性
    只能用于新样式的类。如果您的类不继承自
    对象
    ,则无法实现属性

    class PClass(object):
        def __init__(self):
            self.x = ValClass() # if you don't do this, all PClass objects will share an x
            self.y = 1
    
        @property
        def v(self):
            return self.x.val
        @v.setter
        def v(self, val):
            self.x.val = val
        @v.deleter
        def v(self):
            del self.x.val
    
        def solv(self):
            print self.v #9999
            self.x.pr()
    

    小心,
    p.x
    在实例之间共享。改为在
    \uuu init\uuu
    中创建
    ValClass()
    的新实例。请小心,
    p.x
    在实例之间共享。改为在
    \uuu init\uuuu
    中创建
    ValClass()
    的新实例。区别在于旧样式类与新样式类的区别。只有新样式的类支持使
    属性
    工作所需的描述符协议。区别在于旧样式的类与新样式的类。只有新型类支持使
    属性
    工作所需的描述符协议。