Python中另一个类的一个类的Access属性

时间:2014-11-01 09:26:43

标签: python oop

我'在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'

4 个答案:

答案 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)

appListgetUrl类实例中的变量。因此,您只能访问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,它更舒服。