我正在创建一个包含很多嵌套类的包。想象一下2类:房屋和屋顶。房屋可以实例化屋顶,也可以进行存储,更改其属性并调用其方法。但是相反的问题呢?屋顶对象能否找出它是否由房屋实例化并发现有关该父对象的任何信息?我的假定父House对象在此伪代码中为<parent>

class House(object):
    def __init__(self, style:str):
        self.style = style
        self.roof = Roof()

class Roof(object):
    def __init__(self):
        self.type = None
        if <parent>:
            if <parent>.style = 'Rambler':
                self.type = 'Open Gable'
            elif <parent>.style = 'Bungalow':
                self.type = 'Hip'

h = House('Bungalow')


对于这可能是如何工作,这只是一个疯狂的猜测,但是我正在测试以查看是否存在父类,然后想要访问其属性。这可能吗?

我知道我可以将一个参数(房屋的样式)传递给Roof的__init__,但是我要解决的真正问题是涉及更多的属性,这是我要避免的。

我已经看到了通过让Roof类存储属性__house来解决此问题的程序包,我认为这是解决此问题的方法。我假设House将self传递给Roof构造函数,但这似乎需要更多编码,而且我还想知道它是否复制了程序存储的对象。

谢谢!

最佳答案

生成的类可以通过一些技术技巧来弄清楚谁调用了它的构造函数,但这很混乱。

在您的类设计中,可以使Roof在其构造函数中传递对House的引用

class Roof:
    def __init__(self, house):
        self.house = house


但是,查看您的代码,我会看到“代码异味”。当屋顶样式的设置方式取决于房屋的类型时,您将两个类紧密地联系在一起。

“更清洁”的方式是允许以屋顶创建者希望的任何样式创建屋顶:

class Roof:
    def __init__(self, style):
        self.style = style


然后在House内部,选择哪种样式的Roof与哪种样式的房屋相匹配。这样,无论如何屋顶也不需要参考。

10-06 14:55