我'在Python 3中使用OOP(OOP概念对我来说是全新的东西)并试图从另一个类访问一个类的属性(列表)。显然我做错了什么但不明白是什么。
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'
答案 0 :(得分: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 :(得分:2)
您的代码似乎将类与函数混淆。通常,函数名称是动词(例如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 :(得分:1)
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)
语句。
答案 3 :(得分:-1)
使用请求而不是urllib,它更舒服。