2015-04-04 5 views
-1

Я пытаюсь наследовать переменную из базового класса, но интерпретатор выдает ошибку.Доступ к переменному внешнему классу с использованием наследования

Вот мой код:

class LibAccess(object): 
    def __init__(self,url): 
     self.url = url 

    def url_lib(self): 
     self.urllib_data = urllib.request.urlopen(self.url).read() 
     return self.urllib_data 

class Spidering(LibAccess): 
    def category1(self): 
     print (self.urllib_data) 


scrap = Spidering("http://jabong.com") 
scrap.category1() 

Это выход:

Traceback (most recent call last): 
    File "variable_concat.py", line 16, in <module> 
    scrap.category1() 
    File "variable_concat.py", line 12, in category1 
    print (self.urllib_data) 
AttributeError: 'Spidering' object has no attribute 'urllib_data' 

В чем проблема с кодом?

+0

'urllib_data' добавлен только в функцию' url_lib'. Вы можете вызвать функцию перед печатью 'urllib_data' – thefourtheye

+0

, проблема заключается в том, что в LibAccess '__init __() и url_lib() вы присваиваете значение атрибуту объекта (то есть и экземпляру класса) , а не классу. 'self.var' создает' var' в пространстве имен self (т. е. объект, экземпляр класса LibAccess). Вы никогда не создавали такой объект. Что именно вы пытаетесь достичь? – Pynchia

ответ

0

Перед обращением к нему необходимо определить self.urllib_data. Простым способом было бы создать его во время инициализации, например.

class LibAccess(object): 
    def __init__(self,url): 
     self.url = url 
     self.urllib_data = None 

Таким образом, вы можете быть уверены, что он существует каждый раз, когда вы пытаетесь получить к нему доступ. Из вашего кода я считаю, что вы не хотите получать фактические данные во время инициализации. В качестве альтернативы вы можете позвонить self.url_lib() из __init__(..), чтобы прочитать данные в первый раз. Обновление позже было бы сделано так же, как и раньше.

+0

, но я хочу получить данные «urllib_data» вместо None – Mounarajan

+2

@Mounarajan: в этом случае вызовите self.url_lib() во время инициализации, как это было предложено в моем ответе. – fuesika

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