动态更新不同类之间的类属性

时间:2017-03-03 01:07:50

标签: python oop properties attributes

我试图管理通过Python对象层次结构创建的目录树。我想在JSON中序列化顶级对象,这样我就可以与用户共享两件事:JSON文件和目录。我希望其他用户能够指向该目录,因此这里的问题是设置可能在另一台计算机上更改的根目录。

以下是我现在所拥有的一个例子:

import os.path as op
class Top():
    def __init__(self, root_dir):
        self._root_dir = root_dir

        intop = InTop(self.base_dir)
        self.intop = intop

    @property
    def root_dir(self):
        return self._root_dir

    @root_dir.setter
    def root_dir(self, path):
        self._root_dir = path

    @property
    def base_dir(self):
        return op.join(self.root_dir, 'Top')

class InTop():
    def __init__(self, root_dir):
        self._intop_dir = op.join(root_dir, 'InTop')

    @property
    def intop_dir(self):
        return self._intop_dir

    @intop_dir.setter
    def intop_dir(self, path):
        self._intop_dir = path

我很高兴现在如何更新Top对象中的路径:

t = Top('~/projects/')
print(t.root_dir)  # ~/projects/
print(t.base_dir)  # ~/projects/Top

t.root_dir = '~/Downloads/'
print(t.root_dir)  # ~/Downloads/
print(t.base_dir)  # ~/Downloads/Top

但是有没有办法让这个改变传播到InTop对象?

t = Top('~/projects/')
print(t.root_dir)  # ~/projects/
print(t.base_dir)  # ~/projects/Top
print(t.intop.intop_dir)  # ~/projects/Top/InTop

t.root_dir = '~/Downloads/'
print(t.root_dir)  # ~/Downloads/
print(t.base_dir)  # ~/Downloads/Top
print(t.intop.intop_dir)  # ~/projects/Top/InTop   <--- How to update this?

如何打印最后一行&#34;〜/ Downloads / Top / InTop&#34;代替?

也许有更好的方法来管理这样的相关文件路径 - 如果是这样,请告诉我。

提前致谢!

1 个答案:

答案 0 :(得分:0)

想出来..只需要在Top setter中设置它(也纠正了我的setter)

import os.path as op
class Top(object):
    def __init__(self, root_dir):
        self._root_dir = root_dir

        intop_obj = InTop(self.top_dir)
        self.intop = intop_obj

    @property
    def root_dir(self):
        return self._root_dir

    @root_dir.setter
    def root_dir(self, path):
        self._root_dir = path
        self.intop.top_dir = self.top_dir

    @property
    def top_dir(self):
        return op.join(self.root_dir, 'Top')

class InTop(object):
    def __init__(self, top_dir):
        self._top_dir = top_dir

    @property
    def top_dir(self):
        return self._top_dir

    @top_dir.setter
    def top_dir(self, top_dir):
        self._top_dir = top_dir

    @property
    def intop_dir(self):
        return op.join(self.top_dir, 'InTop')

得到我:

t = Top('~/projects/')
print(t.root_dir)  # ~/projects/
print(t.top_dir)  # ~/projects/Top
print(t.intop.intop_dir)  # ~/projects/Top/InTop

t.root_dir = '~/Downloads/'
print(t.root_dir)  # ~/Downloads/
print(t.top_dir)  # ~/Downloads/Top
print(t.intop.intop_dir)  # ~/Downloads/Top/InTop