从Python中的super()获取可能会更改的属性

从Python中的super()获取可能会更改的属性,python,python-3.x,oop,Python,Python 3.x,Oop,我正在尝试构建一个框架,但在类之间的属性继承方面遇到了问题。我有一个名为framework的文件夹,带有init.py,如下所示: from management import projects from models import model projects = projects() model = model() 然后,管理层看起来像: class projects(object): def __init__(self): self._current = Non

我正在尝试构建一个框架,但在类之间的属性继承方面遇到了问题。我有一个名为framework的文件夹,带有init.py,如下所示:

from management import projects
from models import model

projects = projects()
model = model()
然后,管理层看起来像:

class projects(object):
    def __init__(self):
        self._current = None

    @property
    def current(self):
        return self._current

    def set_current(self, name):
        """setting a project by name, then self._current = name"""
最后,模型:

class model(projects):
    def __init__(self):
        super(model, self).__init__()

    @property
    def current(self):
        return super().current
然后,当我尝试使用其他脚本中的框架时:

import framework as fw

fw.projects.set_current('foo')
fw.model.current
它返回None而不是foo。我很确定错误在框架中的init文件中,在设置项目之前,实例是在框架中完成的,我尝试了一些不同的方法,但我没有任何线索。models类如何注意到projects类中的更改??此外,我并不真的希望该模型具有属性current,但我需要它在其他方法中的值(无论如何,如果模型按照我的预期工作,我不关心模型是否具有该属性)。谢谢

编辑:


现在,我将在后端存储一些元数据,以便从任何类访问它。但是我仍然想知道是否有更优雅的解决方案。

根据我在过去几个月里深入处理Python的拙劣经验,我认为尝试从父类访问子类的属性是荒谬的,因为在这种情况下,它们是不同的实例

projects = projects()
model = model()
这里您正在创建两个不同的实例,它们不共享任何内容,因此在
project
中所做的更改对
model
不可见。我建议使用组合而不是继承,并将
项目
依赖项注入
模型

模范班

class Model:

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

    def get_current(self):
        return self.project.get_current()
项目类

class Project:

    # in Python 3 there is no need to use the implicit-object inheritance
    def __init__(self):
        self.current = None

    def get_current(self):
        return self.current

    def set_current(self, value):
        self.current = value
和他们玩

from framework.Model import Model
from framework.Project import Project

project = Project()
model = Model(project)

project.set_current("Example")

print(model.get_current())  # Example
我希望这有帮助


Tomás.

模拟从何而来?将
超级(模型,自我).\uu初始(自我)
更改为
超级(项目,自我).\uu初始(自我)
后期编辑,抱歉!使用
super(projects,self)。\uuu init\uuuu()
我得到以下错误
AttributeError:“model”对象没有属性“\u current”
谢谢Tomás!我在考虑类似的解决方案。如果我不能分别实现
fw.projecs
fw.model
的预期行为,我将使用它。我现在正在尝试与观察员。