【问题标题】:Access superclass objects from subclass从子类访问超类对象
【发布时间】:2017-09-13 09:01:58
【问题描述】:

我对课程还是新手,我正在努力实现一个我正在尝试实现的子类。

所以我有我的Nitin 类:

import requests
from bs4 import BeautifulSoup


class Nitin(object):
    def __init__(self, username, password):
        self.username = username
        self.password = password
        self.session = requests.session()
        self.urls = {'base': 'http://nitinproductions.com/models/', 'models': 'http://nitinproductions.com/models/models.php'}

    def login(self):
        self.session.auth = (self.username, self.password)
        r = self.session.get(self.urls['models'])
        return self.session

这一步很好,因为我可以登录并且self.sessionlogin() 函数中的更新。现在我有一个Model 子类,它应该可以访问原始的Nitin.session

class Model(Nitin):
    def __init__(self, nitin, model):
        super(Model, self).__init__(nitin)
        self.model = model
        self.nitin = nitin


    def media(self):
        r = self.nitin.session.get(self.model)
        print(r.status_code)
        soup = BeautifulSoup(r.text, 'html.parser')
        for table in soup.find('div', {'id': 'photobar'}).findAll('table'):
            print(table)

我正在尝试在我的主代码中执行此操作,如下所示:

# Imports all Nitin classes
from src import *

# Initialize Nitin object
ripper = Nitin(username='aaaa', password='bbb')
# Initialize session with u/p
ripper.login()

# Initialize Model by passing the Nitin object to it, as well as a link
model = Model(nitin=ripper, model='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php')

但这会引发以下异常:

    model = Model(nitin=ripper, model='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php')
  File "/home/redact/git/redact/src/Nitin.py", line 32, in __init__
    super(Model, self).__init__(nitin)
TypeError: __init__() missing 1 required positional argument: 'password'

我想我正在理解所穿的课程。我实际上想做以下事情:

rippper = Nitin(username='aaaa', password='bbbb)
rippper.login()
rippper.Model.media()

但我不知道这是否可能。

【问题讨论】:

    标签: python-3.x subclass super


    【解决方案1】:

    我不是 100% 确定您要做什么,但错误是由于 Model 扩展 Nitin 除了包含它。实现这一点的原因是

    class Model(Nitin):
    

    由于 Model 还包含对 Nitin 对象的引用,我怀疑你真的想要类似的东西

    class Model(object):
    

    super(Model, self).__init__(nitin) 行尝试调用超类的构造函数。在这种情况下,使用一个参数 (nitin) 调用 Nitin.__init__,而不是所需的用户名和密码。

    我建议您将Model 扩展object 并在这种情况下完全删除对super(...).__init__ 的任何调用。

    扩展一个类意味着它的所有属性和功能都可用于扩展类,而无需重新实现相同的代码。您的代码看起来只需要引用 Nitin 实例(您正在正确执行),而不是扩展它(您正在执行,但不正确)。

    要回答有关如何从Nitin 引用Model 的问题:您可以在Nitin.__init__ 中使用self 作为对Nitin 的调用中的Nitin 引用来初始化模型@。你的Nitin.__init__ 看起来像这样:

    def __init__(self, username, password, model_url):
        self.username = username
        self.password = password
        self.session = requests.session()
        self.urls = {'base': 'http://nitinproductions.com/models/', 'models': 'http://nitinproductions.com/models/models.php'}
        self.model = Model(self, model_url)
    

    然后您可以准确地执行您想要的代码,唯一的区别是您将模型 URL 传递给 Nitin 构造函数以及 model 属性是小写的事实:

    rippper = Nitin(username='aaaa', password='bbbb', model_url='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php')
    rippper.login()
    rippper.model.media()
    

    【讨论】:

    • 在进行您建议的更改后,它可以工作,但我想知道在我初始化Nitin 之后,是否有办法像Nitin.Model.some_function_from_Model() 一样调用Model 类。 Nitin 被初始化并创建了会话,我可以继续使用 Model
    • @ou_snaaksie。然后只需在Nitin.__init__ 中初始化self.model。您可以将self 传递给Model.__init__,就像您现在在外部代码中所做的那样。
    • 我不太明白.. 抱歉。你介意用你刚才所说的话更新你的答案吗?这些课程让我感到困惑
    • @ou_snaaksie。刚刚做了。
    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 2021-05-24
    • 2013-03-24
    • 2018-10-14
    相关资源
    最近更新 更多