从另一个类的另一个实例访问类的“上层”实例

时间:2010-06-16 16:18:49

标签: python oop field

我想知道是否有办法访问实例化对象的类(或其字段)。假设我有:

def Class1:
    def __init__(self):
        self.title = "randomTitle"
        self.anotherField = float()
        self.class2Field = Class2()

以及类型为class2Field的类:

def Class2:
    def __init__(self):
        self.field1 = ""
        self.field2 = ""
        # . . . #

我想知道是否有办法从Class2中声明的Class1实例访问Class1实例(意思是,访问Class1的字段self.class2Field实例中的变量Class1

我知道我总是可以更改Class2中的__init__以接受Class1参数,但我想知道是否有另一种方法可以“爬”通过类层次结构。

非常感谢!

3 个答案:

答案 0 :(得分:4)

是的,但不要这样做。明确传递对象。

答案 1 :(得分:1)

这里没有“阶级等级”可言。您的Class1个对象包含Class2个对象,但您的Class2个对象不知道该对象。

您可以将self.parent中的Class2定义为Class1的实例,引用self.class2Field中的对象,并传递您的Class1实例__init__

def Class1:
    def __init__(self):
        self.title = "randomTitle"
        self.anotherField = float()
        self.class2Field = Class2(self)
        # . . . #

def Class2:
    def __init__(self, parent):
        self.parent = parent
        self.field1 = ""
        self.field2 = ""
        # . . . #

它很难看,它的开销更大,而且它要求Class2总是被包含(至少我上面写的方式),但它可能会做你想要的。

答案 2 :(得分:0)

您不必弄乱子类(Class2)的定义。在创建实例后,只需将另一个属性附加到其实例。

def Class1:
    def __init__(self):
        self.title = "randomTitle"
        self.anotherField = float()
        self.class2Field = Class2()
        self.class2Field.parent = self  # <- This is where you attach the pointer to parent.
        # . . . #

def Class2:
    def __init__(self):
        self.field1 = ""
        self.field2 = ""

    def mess_with_parent(self):
        '''Example of access to instance-level property "parent"'''
        if hasattr(self, 'parent') and self.parent != None: 
            # instead of "!= None" insert your way of checking that .parent is right type
            self.parent.anotherField = 5.0
        # . . . #

a = Class1()
<instance of class1> = a.class2Field.parent
b = a.class2Field
<instance of class1> = b.parent