【问题标题】:Accessing variable outside class using inheritance使用继承访问类外的变量
【发布时间】:2015-04-04 06:28:50
【问题描述】:

我试图从基类继承一个变量,但解释器抛出一个错误。

这是我的代码:

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'

代码有什么问题?

【问题讨论】:

  • urllib_data 仅在 url_lib 函数中添加。您可能希望在打印 urllib_data 之前调用该函数
  • 问题在于,在 LibAccess 的 __init__() 和 url_lib() 中,您将值分配给对象的属性(即类的实例),而不是类. self.var 在 self 的命名空间中创建 var(即对象,类 LibAccess 的实例)。您从未创建过这样的对象。你到底想达到什么目的?

标签: python class variables inheritance


【解决方案1】:

您需要在访问之前定义self.urllib_data。最简单的方法是在初始化期间创建它,例如

class LibAccess(object):
    def __init__(self,url):
        self.url = url
        self.urllib_data = None

这样您就可以确保每次尝试访问它时它都存在。从您的代码中,我认为您不想在初始化期间获取实际数据。或者,您可以从__init__(..) 调用self.url_lib() 第一次读取数据。稍后更新它的方式与以前相同。

【讨论】:

  • 但我想得到这个“urllib_data”数据而不是None
  • @Mounarajan:在这种情况下,按照我的回答中的建议在初始化期间调用 self.url_lib()。
猜你喜欢
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多