Доступ к «верхнему» экземпляру класса из другого экземпляра другого класса - PullRequest
0 голосов
/ 16 июня 2010

Я хотел бы знать, есть ли способ получить доступ к классу (или его полям), где создается экземпляр объекта. Допустим, у меня есть:

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

и класс, тип которого будет class2Field:

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

Я хотел бы знать, есть ли способ получить доступ к экземпляру Class1 из экземпляра Class2, который объявлен в Class1 (что означает доступ к полям Class1 из переменной self.class2Field в тот Class1 экземпляр)

Я знаю, что всегда могу изменить __init__ в Class2 так, чтобы он принимал параметр Class1, но я хотел бы знать, есть ли другой способ "лазить" по иерархии классов.

Большое спасибо!

Ответы [ 3 ]

4 голосов
/ 16 июня 2010

Да, но не делай этого. Передайте объект явно.

1 голос
/ 16 июня 2010

Здесь нет «иерархии классов», о которой можно говорить.Ваши 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 всегда содержался (по крайней меретак, как я написал выше), но он может делать то, что вы хотите.

0 голосов
/ 17 июня 2010

Вам не нужно связываться с определением дочернего класса (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
...