2016-08-18 63 views
0

我剛剛掌握了python,並且正在嘗試使用子類方法更改Parent類變量的值。我的代碼的基本示例如下。更改子類中的父變量,然後在父類中使用新值?

from bs4 import BeautifulSoup 
import requests 
import urllib.request as req 

class Parent(object): 
    url = "http://www.google.com" 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content, "lxml") 
    print(url) 

    def random_method(self): 
     print(Parent.soup.find_all()) 

class Child(Parent): 
    def set_url(self): 
     new_url = input("Please enter a URL: ") 
     request = req.Request(new_url) 
     response = req.urlopen(request) 
     Parent.url = new_url 

    def print_url(self): 
     print(Parent.url) 

如果我運行的方法,輸出如下。

run = Child() 

run.Parent() 
>>> www.google.com 

run.set_url() 
>>> Please enter a url: www.thisismynewurl.com 

run.print_url() 
>>> www.thisismynewurl.com 

run.random_method() 
>>> #Prints output for www.google.com 

任何人都可以解釋爲什麼當我運行print_url我可以得到新的URL印刷,但如果我嘗試和另一種方法使用它,它恢復到原來的值?

+0

我肯定會看看python上的Classes文檔。我想你可能會遺漏一些關於無關性,方法和屬性的關鍵點。 https://docs.python.org/2/tutorial/classes.html – Adam

回答

0
class Parent(object): 
    url = "http://www.google.com" 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content, "lxml") 
    print(url) 

來分配soup的代碼運行一次,在類定義時間。

因此Parent.url的變化將不會反映在random_method的調用中,因爲湯已經被收集。

+0

哦,我明白了。那麼有沒有一種重新運行新的url的方法呢?或者我將不得不重建我的代碼來獲取網址?我在我的實際代碼中通過cmd輸入設置我的url,但由於cmd.py繼承自Main.py,因此如果沒有我的url變量在我的Main.py中有一個有效的URL,我無法正確運行。 – iguanabanana

+0

更改您的代碼,以便通過方法進行請求,而不是在課堂級進行。那麼你將不得不明確地調用該方法。 – wim

+0

謝謝!我讓事情變得比他們需要的複雜得多,我現在有事情正在工作:) – iguanabanana

0

因爲當您使用Parent.url時,它使用類Parent中設置的靜態值,而不是來自類實例的值。

+0

那麼如何從類Child打印(Parent.url)並獲得我設置的新值?那麼有什麼方法可以在Parent類中使用我在Child中設置的值? – iguanabanana

+0

@iguanabanana爲什麼要訪問其子中的父實例的值?只需在孩子的實例中訪問相同的值。既然是小孩,那就是 –