从子类访问超类对象

Access superclass objects from subclass

我对 classes 还是个新手,我正在努力实现一个子class。

所以我的 Nitin class 是这样的:

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.session是在login()函数中更新。现在我有一个 Model subclass,它应该可以访问原始 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'

我想我理解 classes worng。我实际上想做以下事情:

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

但我不知道这是否可能。

我不是 100% 确定你要做什么,但错误是由于 Model extends Nitin 另外包含它。实现这一点的行是

class Model(Nitin):

由于 Model 还包含对 Nitin 对象的引用,我怀疑您真的想要

class Model(object):

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

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

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

要回答有关如何从 Nitin 引用 Model 的问题:您可以使用 self 作为 NitinNitin.__init__ 中初始化模型] 在对 Model.__init__ 的调用中引用。您的 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()