访问创建另一个 class 的 class

Accessing the class that created another class

我正在创建一个包含很多嵌套 classes 的包。想象一下 2 classes:房子和屋顶。 House 可以实例化一个 Roof,也可以存储它、更改它的属性并调用它的方法。但是反过来的问题呢? Roof 对象能否确定它是否由 House 实例化并发现有关该父对象的任何信息?在这个伪代码中,我假设的父 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')

这只是对其工作原理的粗略猜测,但我正在测试以查看父 class 是否存在,然后想访问其属性。这可能吗?

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

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

谢谢!

生成的 class 可以通过一些技术上的 hacky 方法找出调用其构造函数的人,但这会非常混乱。

在您的 class 设计中,您可以使 Roof 在其构造函数

中传递对 House 的引用
class Roof:
    def __init__(self, house):
        self.house = house

但是,查看您的代码,我看到 "code smell"。当屋顶样式的设置方式取决于房屋的类型时,您将这两个 class 紧密地联系在一起。

"cleaner" 方法是允许使用屋顶创建者想要的任何样式创建屋顶:

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

然后在 House 内部,您可以选择哪种屋顶风格与哪种房屋风格相匹配。这样一来,屋顶就不需要引用回房子了。