微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将变量设置为对象时,将其设置为内部的所有嵌套对象

如何解决将变量设置为对象时,将其设置为内部的所有嵌套对象

我有以下有效的代码

class fundamental_object():

    def __init__(self,x):
        self.x = x

class encapsulator_object():

    def __init__(self,x,obj_list):
        self._x = x
        self.obj_list = obj_list

    @property
    def x(self):
        return self.x

    @x.setter
    def x(self,new_x):
        print('in setter!')
        self._x = new_x
        for obj in self.obj_list:
            obj.x = new_x

if __name__ == '__main__' :
    x = 10
    obj_1 = fundamental_object(x)
    obj_2 = fundamental_object(x)
    obj_list = [obj_1,obj_2]
    encapsulator = encapsulator_object(x,obj_list)

    encapsulator.x = 20
    print(encapsulator._x)
    print(obj_1.x) # all of these are also updated to 20.

如您所见,这个想法是,每当我更改封装器对象的属性“x”时,我都希望其中的所有嵌套对象 (fundamental_objects) 也使用这个新变量“x”进行更新。然而,从用户的角度来看,这很快就会变得混乱,因为,如果我理解正确,“x”是“fundamental_object”的整数,而“x”是“encapsulator_object”的方法,并且实际上访问整数我需要使用“_x”的封装器。是否有任何简单/正确/pythonic 的方法可以使它如下工作:

    x = 10
    obj_1 = fundamental_object(x)
    obj_2 = fundamental_object(x)
    obj_list = [obj_1,obj_list)

    encapsulator.x = 20
    print(encapsulator.x) # notice the underscore is Now gone!  
    print(obj_1.x)        # this would be updated to 20 as well

我知道可以让“fundamental_objects”也有“_x”作为整数变量,这会在一定程度上减少混淆,但是,如果可能的话,我还是想完全去掉下划线! (现在我得到了无限递归)。谢谢!

解决方法

检查此代码。我只在您的财产中更改了您的 getter 方法。现在它指向 self._x

class fundamental_object():
    def __init__(self,x):
        self.x = x


class encapsulator_object():
    def __init__(self,x,obj_list):
        self._x = x
        self.obj_list = obj_list

    @property
    def x(self):
        return self._x   # -----> here

    @x.setter
    def x(self,new_x):
        print('in setter!')
        self._x = new_x
        for obj in self.obj_list:
            obj.x = new_x


if __name__ == '__main__':
    x = 10
    obj_1 = fundamental_object(x)
    obj_2 = fundamental_object(x)
    obj_list = [obj_1,obj_2]
    encapsulator = encapsulator_object(x,obj_list)

    encapsulator.x = 20
    print(encapsulator.x)  # notice the underscore is now gone!
    print(obj_1.x)  # this would be updated to 20 as well

作为替代方案,您可以完全删除 x 中的 _xencapsulator_object。然后在您的 getter 中,您可以在 x 中找到 self.obj_list :

class fundamental_object():
    def __init__(self,obj_list):
        self.obj_list = obj_list

    @property
    def x(self):
        return self.obj_list[0].x

    @x.setter
    def x(self,new_x):
        print('in setter!')
        for obj in self.obj_list:
            obj.x = new_x

请记住,在此示例中,因为我们决定选择列表中的第一项,所以所有对象都必须具有相同的 x 值。但是,在您可以使用 setter 之后,无需担心。如果你想在 setter 之前调用 getter,我提到过。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。