python 3类实例调用彼此的属性/变量?

时间:2017-05-09 03:36:47

标签: python python-3.x

我的主模块“actormain”看起来像这样:

import bodymain as bd
import soulmain as sl
(import statements of the other relevant modules, long and not super relevant)

class actor():
    def __init__(self, name, pron1, pron2, desc):
        self.name = name
        print ('creating ' + self.name + '.')
        self.owner = self
        self.pron1 = pron1
        self.pron2 = pron2
        self.desc = desc
        self.body = bd.body(self.owner)
        self.soul = sl.soul(self.owner)
        self.greet()



    def greet(self):
        print (self.pron1 + ' calls out, "Hey, my name\'s ' + self.name + '."')

它将“self.body”设置为一个值(这是另一个类的实例,“body()”,在另一个模块中),然后以更多的细节构建身体的其余部分(例如:body实例包含“hands()”类的实例,在第三个模块中定义),将actor实例作为变量“owner”传递。

我的问题:在命令行中,我可以参考,比方说,

actor_instance.body.hands.owner.body.hands.fingers.owner.body... etc.,它运作正常。但是,如果我尝试从实例“手指”中引用它(使用相同的语法!),例如,我得到"AttributeError: 'actor' object has no attribute 'body'."

更多,如果在命令行中,我说:

>>>a = actor(args)

>>>a.body.owner.body

<bodymain.body object at 0x0000000002F74A90>

很明显,actor对象有一个body属性。

但在加载时,这个:

>>> import actormain as am
>>> b = am.actor('bob', 'he', 'his', 'slim')
creating bob.
incarnating bob.
Traceback (most recent call last):
  File "<pyshell#268>", line 1, in <module>
    b = am.actor('bob', 'he', 'his', 'slim')
  File "C:\Program Files (x86)\python361\lib\actormain.py", line 16, in __init__
    self.body = bd.body(self.owner, self.bodydesc)
  File "C:\Program Files (x86)\python361\lib\bodymain.py", line 13, in __init__
    self.hand = so.hand(self.owner, '')
  File "C:\Program Files (x86)\python361\lib\sensorg.py", line 156, in __init__
    self.fingers = fingers(self.owner, '')
  File "C:\Program Files (x86)\python361\lib\sensorg.py", line 110, in __init__
    self.a = self.owner.body
AttributeError: 'actor' object has no attribute 'body'

到底是怎么回事?为什么我不能参考这个?

1 个答案:

答案 0 :(得分:0)

您可以从追溯中看到发生了什么。您的代码调用self.body = body(...)来创建正文。在创建正文的过程中,某些代码会尝试访问“所有者”的正文。但是主人还没有身体,因为它仍然处于被创造的过程中。

如果您的身体部位需要能够进入身体,则无法从身体内部创建它们。在body(...)的调用完全结束并返回之前,正文将不存在。