2014-11-01 4 views
0

Я играю с OOP (концепция OOP - это нечто совершенно новое для меня) в Python 3 и пытается получить доступ к атрибуту (списку) одного класса из другого класса. Очевидно, я делаю что-то неправильно, но не понимаю, что.Атрибут доступа одного класса из другого класса в Python

from urllib import request 
from bs4 import BeautifulSoup 

class getUrl(object): 
    def __init__(self): 
     self.appList = [] 
     self.page = None 
    def getPage(self, url): 
     url = request.urlopen(url) 
     self.page = url.read() 
     url.close() 
    def parsePage(self): 
     soup = BeautifulSoup(self.page) 
     for link in soup.find_all("a"): 
      self.appList.append(link.get('href')) 
     return (self.appList) 

class getApp(object): 
    def __init__(self): 
     pass 
    def selectApp(self): 
     for i in getUrl.appList(): 
      return print(i) 

a = getUrl() 
a.getPage("http://somepage/page") 
a.parsePage() 

b = getApp() 
b.selectApp() 

И я получаю:

AttributeError: type object 'getUrl' has no attribute 'appList' 
+3

Здесь нет смысла, чтобы getApp был классом. –

ответ

1

Ваш код, похоже, путает классы с функциями. Обычно имя функции - это глагол (например, getUrl), поскольку он представляет собой действие. Имя класса обычно является существительным, поскольку оно представляет собой класс объектов, а не действия. Например, следующий ближе к тому, как я ожидал бы увидеть классы используются:

from urllib import request 
from bs4 import BeautifulSoup 

class Webpage(object): 
    def __init__(self, url): 
     self.app_list = [] 
     url = request.urlopen(url) 
     self.page = url.read() 
    def parse(self): 
     soup = BeautifulSoup(self.page) 
     for link in soup.find_all("a"): 
      self.app_list.append(link.get('href')) 
     return self.app_list 

class App(object): 
    def __init__(self, webpage, number): 
     self.webpage = webpage 
     self.link = webpage.app_list[number] 

my_webpage = Webpage("http://somepage/page") 
my_webpage.parse() 
selected_app = App(my_webpage, 1) 
print (selected_app.link) 

Обратите внимание, что мы обычно делаем экземпляр класса (например, my_webpage) затем методы доступа и свойства экземпляра, а не из самого класса. Я не знаю, что вы намерены делать со ссылками, найденными на странице, поэтому неясно, нужен ли им собственный класс (App) или нет.

2

Вам необходимо пройти в getUrl()например; атрибуты нет на самом классе:

class getApp(object): 
    def __init__(self): 
     pass 
    def selectApp(self, geturl_object): 
     for i in geturl_object.appList: 
      print(i) 

(обратите внимание на удаленный return, а также, print() возвращает None и вы бы выйти из цикла раньше).

и

b = getApp() 
b.selectApp(a) 
1

The appList является переменной в экземпляре класса getUrl. Таким образом, вы можете получить доступ к нему только для каждого экземпляра (объекта) класса getUrl. Проблема здесь:

class getApp(object): 
    def __init__(self): 
     pass 
    def selectApp(self): 
     for i in getUrl.appList(): 
      return print(i) 

Посмотрите на getUrl.appList(). Здесь вы вызываете класс, а не объект. Вы также можете посмотреть заявление return print(i).

0

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

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