2015-04-04 57 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 2015-04-04 06:30:51

+0

問題在於,在LibAccess的__init __()和url_lib()中,你正在爲一個對象的屬性(即類的實例)賦值, ,而不是上課。 'self.var'在self的名稱空間(即對象,類LibAccess的實例)中創建'var'。你從來沒有創建過這樣的對象。 你究竟想要達到什麼目的? – Pynchia 2015-04-04 07:37:56

回答

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」數據而不是無 – Mounarajan 2015-04-04 06:36:14

+2

@Mounarajan:在這種情況下,在初始化過程中調用self.url_lib(),如我的答案中所建議的。 – fuesika 2015-04-04 06:39:25