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

问题描述:

我想知道是否有办法访问实例化对象的类(或其字段)。比方说,我有:从另一个类的另一个实例访问类的“上”实例

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实例访问Class 1的实例的方式即在Class1声明(意思是,从变量self.class2Field访问的Class1领域在Class1实例)

我知道我可以随时更改__init__在Class2中接受Class1参数,但我想知道是否有另一种“攀爬”类层次结构的方式。

非常感谢!

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

+1

:D来吧ooooon:DI只需要访问中的一个字段,以显示正确的调试信息......是不是要去伤害任何人...:d:d THX的快速回复,但。 .. – BorrajaX 2010-06-16 16:26:48

在这里没有“类层次”可以说。您的Class1对象包含Class2对象,但您的Class2对象不知道。

你可以在Class2定义self.parent到是指物体在self.class2FieldClass1实例,并让您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

是啊...我想我可能不得不把它包裹...但它是一个可惜:( 它使事情的方式比我预期的更复杂... – BorrajaX 2010-06-16 22:32:14

你不必乱搞子类(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 
+0

如果你设置'z = Class2()',那么当你执行'z.mess_with_parent()'时会出错,因为属性'parent'不存在。 – eksortso 2010-06-17 18:55:26

+0

你是对的。 ) 而不是 如果self.parent =无: 应该是这样的: 如果在目录(个体经营)“父”: 如果self.parent =无:#!(或者在这里把你额外的验证逻辑): 或: – ddotsenko 2010-06-18 18:44:45