从子类

时间:2017-04-17 17:50:51

标签: python-3.x subclass super

我仍然是新手,我正在努力实现一个子类。

所以我有这样的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()

但我不知道这是否可行。

1 个答案:

答案 0 :(得分:1)

我并非100%确定您要执行的操作,但错误的原因是Model 扩展 Nitin除了包含它之外。实现这一目标的路线是

class Model(Nitin):

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

这样的东西
class Model(object):

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

我建议您Model延长object,并在此情况下完全删除对super(...).__init__的任何调用。

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

要回答有关如何从Model引用Nitin的问题:您可以使用Nitin.__init__作为self参考,在Nitin内初始化模型在致电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属性为小写的事实:< / p>

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