2012-04-10 44 views
2

我想將自引用傳遞給實例化的類(子應該可以訪問父級)。它的工作原理,如果一切都在一個文件中是這樣的:將自引用傳遞給實例化的類

class ClassB: 
    def __init__(self, name, parent): 
    assert isinstance(parent, ClassA) 
    self.name = name 
    self.parent = parent 
    print('my parent is', parent.name) 

class ClassA: 
    def __init__(self, name): 
    self.name = name 
    self.b = ClassB('child', self) 

a = ClassA('parent') 

my parent is parent預期

輸出的2文件版本是這樣的:

class ClassB: 
    def __init__(self, name, parent): 
    from ClassA import ClassA 
    assert isinstance(parent, ClassA) 
    self.name = name 
    self.parent = parent 
    print('my parent is', parent.name) 

和:

from ClassB import ClassB 

class ClassA: 
    def __init__(self, name): 
    self.name = name 
    self.b = ClassB('myName', self) 

if __name__ == '__main__': 
    a = ClassA('parent') 

輸出爲assert isinstance(parent, ClassA) AssertionError

+0

你的文件classB.py沒有引用ClassA – avasal 2012-04-10 08:32:29

+1

它在'__init__'函數中導入ClassA。否則,導入不起作用。 – HWende 2012-04-10 08:34:25

回答

6

這是因爲第二次通過__main__.ClassA,而ClassB預計ClassA.ClassA。找到一個不同的方式,例如將ClassA放在它自己的模塊中。

+0

刪除**如果**沒有幫助。 – HWende 2012-04-10 08:31:17

+2

'if'與它完全無關。 – 2012-04-10 08:32:25

+0

我站好了。當我將ClassA的實例放入_another_文件時,它可以工作。你能解釋一下有什麼不同嗎? – HWende 2012-04-10 08:35:31

1
class ClassB: 
    def __init__(self, name, parent, ClassA): 
    assert isinstance(parent, ClassA) 
    self.name = name 
    self.parent = parent 
    print('my parent is', parent.name) 

和:

from ClassB import ClassB 

class ClassA: 
    def __init__(self, name): 
    self.name = name 
    self.b = ClassB('myName', self, ClassA) 

if __name__ == '__main__': 
    a = ClassA('parent') 

這對我的作品,但我不知道,如果這是你在找什麼。

+0

我沒有看到這一點。如果來電者想作弊,他們可以用你的方式做。那麼最好總是省略'assert'檢查... – glglgl 2012-04-10 08:51:42

相關問題