我仍然是新手,我正在努力实现一个子类。
所以我有这样的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.session
是login()
功能中的更新。现在我有了一个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()
但我不知道这是否可行。
答案 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()