2010-04-02 1 views
1

Название немного длинное, но оно должно быть довольно простым для кого-то, хорошо осведомленного о python.В Python, как сделать элементы данных видимыми для подклассов, если они не известны при инициализации объекта?

Я новичок в python. Так что, возможно, я делаю неправильно.

Пусть У меня есть класс TreeNode

class TreeNode(Node): 
    def __init__(self, name, id): 
     Node.__init__(self, name, id) 
     self.children = [] 

и подкласс с весом:

class WeightedNode(TreeNode): 
    def __init__(self,name, id): 
     TreeNode.__init__(self, name, id) 
     self.weight = 0 

До сих пор, я думаю, я в порядке. Теперь я хочу добавить объектную переменную, называемую отцом в TreeNode, так что WeightedNode также имеет этот член. Проблема в том, что я не знаю, когда инициализирует объект, который будет отцом. Я поставил отец впоследствии с помощью этого метода в TreeNode:

def set_father(self, father_node): 
    self.father = father_node 

Проблема тогда, когда я пытаюсь получить доступ к self.father в Weighted:

print 'Name %s Father %s '%(self.name, self.father.name) 

я получаю:

AttributeError: WeightedNode instance has no attribute 'father' 

Я думал, что могу сделать father видимым, делая что-то в TreeNode.__init__, но я не смог найти что.

Как я могу это сделать?

Спасибо.

ответ

2

Вы можете просто инициализировать его со значением по умолчанию:

self.father = None 

Таким образом, атрибут, по крайней мере, быть распознан. И это верно, так как на данный момент действительно нет father.

+0

Я забыл упомянуть, что я я уже сделал это, и я получил: 'print 'Имя% s Отец% s'% (self.name, self.father.name) AttributeError: объект« NoneType »не имеет атрибута« name » ' – LB40

+0

дерьмо, это потому что это не было инициализировано, когда я достиг этой точки программы. правильно ? – LB40

+0

Правильно, вам нужно убедиться, что отец не является None, прежде чем вы сможете использовать имя. – unholysampler

0

В ответ на Ваше заявление на ответ Джастина, попробуйте следующее:

print ' Name %s Father %s '%(str(self.name), str(self.father.name)) 

НТР() команда будет получить строковое представление объекта, даже если это None

+0

Зачем это помогло? Это просто, что в то время, когда выполняется оператор печати, self.father по-прежнему отсутствует. – mjv

+0

Это остановит приложение. Я согласен, что это не решает основной проблемы. –

Смежные вопросы